I am new to coding in C and I cannot figure out the proper way to link my files together so that I can use code from one class in another. I'm working on a project which will likely become a very long program so I am trying to avoid cluttering my main class with a bunch of functions. Instead, I would like to keep them separate and make it easy to transfer the code into any future project.
From looking up similar issues I am assuming this is somewhat simple and that I am probably struggling so much with it because I'm missing the basics of coding in C.
This is what is shown in the terminal:
> Executing task in folder Led-Pot_Circuit_Test: .\Build.cmd 16f887 <
C:\Users\raymu_000\Documents\Programming\VisualStudioCode\PIC_C++_on_VSCode\Led-Pot_Circuit_Test>mkdir output-files
A subdirectory or file output-files already exists.
C:\Users\raymu_000\Documents\Programming\VisualStudioCode\PIC_C++_on_VSCode\Led-Pot_Circuit_Test>C:\Progra~1\Microchip\xc8\v2.32\bin\xc8.exe --chip=16f887 --outdir=".\output-files" ".\main.c"
C:\Progra~1\Microchip\xc8\v2.32\pic\bin\picc --chip=16f887 --outdir=.\output-files .\main.c
Microchip MPLAB XC8 C Compiler V2.32
Build date: Feb 1 2021
Part Support Version: 2.32
Copyright (C) 2021 Microchip Technology Inc.
License type: Node Configuration
0: (499) undefined symbol:
_adc_convert(output-files\main.obj)
(908) exit status = 1
(908) exit status = 1
C:\Users\raymu_000\Documents\Programming\VisualStudioCode\PIC_C++_on_VSCode\Led-Pot_Circuit_Test>C:\Progra~1\Microchip\xc8\v2.32\bin\xc8.exe --chip=16f887 --outdir=".\output-files" ".\Project\InitApp.c"
C:\Progra~1\Microchip\xc8\v2.32\pic\bin\picc --chip=16f887 --outdir=.\output-files .\Project\InitApp.c
Microchip MPLAB XC8 C Compiler V2.32
Build date: Feb 1 2021
Part Support Version: 2.32
Copyright (C) 2021 Microchip Technology Inc.
License type: Node Configuration
Non line specific message: (1091) main function "_main" not defined
(908) exit status = 1
(908) exit status = 1
The terminal process "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -Command .\Build.cmd 16f887" terminated with exit code: 1.
Terminal will be reused by tasks, press any key to close it.
My main class:
//main.c
// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR21V // Brown-out Reset Selection bit (Brown-out Reset set to 2.1V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
#define _XTAL_FREQ 8000000 // 8Mhz
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <pic16f887.h>
#include "Project\user.h"
void main(void) {
//InitApp();
unsigned short adc_value; // variable to hold ADC conversion result in/* Configure the oscillator for the device
ANSELbits.ANS0 = 0; // Disable analog on pin RA0
TRISAbits.TRISA0 = 0; // Set pin RA0 as output
while(1) {
PORTAbits.RA0 = 0; // Set RA0 to LOW
// calculate wait time
adc_value = adc_convert(1); // perform A/D conversion using input from channel 1 (AN1)
__delay_ms(500); // Right shift adc_value two spaces to convert to milliseconds
PORTAbits.RA0 = 1; // Set RA0 to HIGH
adc_value = adc_convert(1);
__delay_ms(500);
}
}
This is my attempt at making a library so that I can "easily" transfer some useful code later onto another project:
//user.h
#ifndef USER_H
#define USER_H
void init_adc(void);
unsigned short adc_convert(unsigned char);
#endif
Useful code:
//InitApp.c
#include <xc.h>
#include <pic16f887.h>
#include "user.h"
/*
Initialize the Analog to Digital Converter
*/
void init_adc(void) {
TRISAbits.TRISA1 = 0b1; // Set pin RA1 as Input
//ANCON0bits.ANSEL1 =0b1;
ADCON1bits.VCFG0 = 0; // set v+ reference to Vdd
ADCON1bits.VCFG1 = 0; // set v- reference to Vss (Gnd)
ADCON1bits.ADFM = 1; // right justify the output
ADCON0bits.ADCS = 0b01; // use Fosc/8 for clock source
ADCON0bits.ADON = 1; // turn on the ADC
}
/*
Preform an analog to digital conversion.
@param channel The ADC input channel to use.
@return The value of the conversion.
*/
unsigned short adc_convert(unsigned char channel) {
ADCON0bits.CHS = channel; // select the given channel
ADCON0bits.GO = 1; // start the conversion
while(ADCON0bits.GO_DONE); // wait for the conversion to finish
return(ADRESH<<8)|ADRESL; // return the result
}
Here are the contents of the "output-files" Folder, when I run the "Build.cmd" task all the files from the compiler go here, but I am missing a few (like ".hex" file) since the program cannot compile properly.

Do I need to have a main class inside of InitApp.c class? How does one properly compile and link C files together??
I would appreciate amy help and advice, thanks.

backslashin include paths, what is the content of your./output-filesdirectory, where is your link command.objfiles, the Linker combines.objfiles and libraries to an executable. Search the doc of your compiler on the complete build workflow