简体   繁体   中英

“Undefined reference to” no idea why?

Im working on a project for stm32f4 to my school. Im using CooCox IDE.

I wanted to add new files "przerwania.c" and "przerwania.h" to write some functions there - not in "main.c". But I have no idea why CooCox is showing me errors. Earlier I wanted to move some of functions from main.c to pwm.c and them work! But I would like to make a new files couse i have more functions.

Errors in CooCox look like this:

[mkdir] Created dir: D:\CooCox\CoIDE\workspace\testowy2\testowy2\Debug\obj
   [cc] 12 total files to be compiled.
   [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -Wall -ffunction-sections -g -O0 -c -DSTM32F407VG -DSTM32F4XX -DUSE_STDPERIPH_DRIVER -D__ASSEMBLY__ -ID:\CooCox\CoIDE\workspace\testowy2 -ID:\CooCox\CoIDE\workspace\testowy2\cmsis_boot -ID:\CooCox\CoIDE -ID:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\include -ID:\CooCox\CoIDE\workspace\testowy2\cmsis -ID:\CooCox\CoIDE\workspace\testowy2\cmsis_lib -ID:\CooCox\CoIDE\workspace D:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\source\stm32f4xx_syscfg.c D:\CooCox\CoIDE\workspace\testowy2\pwm.c D:\CooCox\CoIDE\workspace\testowy2\dupa.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_boot\startup\startup_stm32f4xx.c D:\CooCox\CoIDE\workspace\testowy2\main.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\source\stm32f4xx_rcc.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\source\stm32f4xx_adc.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\source\stm32f4xx_gpio.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_boot\system_stm32f4xx.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\source\stm32f4xx_exti.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\source\misc.c D:\CooCox\CoIDE\workspace\testowy2\cmsis_lib\source\stm32f4xx_tim.c
   [cc] Starting link
   [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -g -nostartfiles -Wl,-Map=testowy2.map -O0 -Wl,--gc-sections -LD:\CooCox\CoIDE\configuration\ProgramData\testowy2 -Wl,-TD:\CooCox\CoIDE\configuration\ProgramData\testowy2/arm-gcc-link.ld -g -o testowy2.elf ..\obj\stm32f4xx_syscfg.o ..\obj\pwm.o ..\obj\dupa.o ..\obj\startup_stm32f4xx.o ..\obj\main.o ..\obj\stm32f4xx_rcc.o ..\obj\stm32f4xx_adc.o ..\obj\stm32f4xx_gpio.o ..\obj\system_stm32f4xx.o ..\obj\stm32f4xx_exti.o ..\obj\misc.o ..\obj\stm32f4xx_tim.o
   [cc] ..\obj\main.o: In function `main':
   [cc] D:\CooCox\CoIDE\workspace\testowy2/main.c:336: undefined reference to `Nowafunkcja'
   [cc] collect2.exe: error: ld returned 1 exit status

main.c is quite long becouse i have some definitions of few long functions there, so I paste here only a part

 #include "stm32f4xx.h"
 #include "misc.h"
 #include "stm32f4xx_syscfg.h"
 #include "stm32f4xx_adc.h"
 #include "stm32f4xx_exti.h"


 #include "przerwania.h"//here is the problem
 #include "pwm.h"

int main(void)
{


    SystemInit();
    //IniDiody();
    //TimConfig();
    //NVIC_Config();
    //IniDiodyPWM();

    LEDInit();
    EXTILine0_Config();

    PWM2();//wiwo
    GPIO();//wiwo

    Nowafunkcja();//PROBLEM


    RCC_Konfiguracja_Adc12();

    GPIO_Configuration_Adc1();
    ADC1_Configuration();
    GPIO_Configuration_Adc1();
    GPIO_Configuration_Adc2();
    ADC2_Configuration();

    IniDiody(GPIO_Pin_14);
    IniTimerPrzerwanie1();


    while(1)
    {
         ADC_SoftwareStartConv(ADC1);
         ADC_SoftwareStartConv(ADC2);
         while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
         wynikADC1 = (float)ADC_GetConversionValue(ADC1);
         while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET);
         wynikADC2 = (float)ADC_GetConversionValue(ADC2);
         wartosc = (int)(wynikADC2 * 15);
         //doPWM=(((float)ADCResult) / 41);
         //wartosc = (int) doPWM;
         //TIM2->CCR3 = (int) doPWM;

         TIM3->CCR2 = 65535;
         TIM3->CCR1 = wartosc;//(int)(wynikADC2 * 15);
         wartoscPrescalera=(int)SystemCoreClock;
    }


}

and files: przerwania.h

#ifndef __przerwaniah
#define __przerwaniah



void Nowafunkcja(void);



#endif

przerwania.c

#include "przerwania.h"


void Nowafunkcja(void)
{
//nothing here - just for test
}

Do you have any idea what is the problem? I'm thinking about this since yesterday and its wird :/ I'll appreciate your help!

Take a look at the line under [cc] 12 total files to be compiled. When you added pwm.c, you also informed the compiler to include this file. You'll see it listed there. przerwania.c is not. If you add przerwania the same way you added pwm, your IDE will take care of making sure it is included in the build.

I'm not sure what your current file/folder structure looks like: http://www.coocox.org/CoIDE/Project_management_config.html can help you determine how to pull those new files into the build.

FWIW: The (anthropomorphized) compiler step says: Is this valid code? So it looks though your main.c, sees that you included przerwania.h, and comes to the conclusion that you correctly used the Nowafunkcja function (just matched the signature). Even though at this point, it has NOT looked into przerwania.c to find out what it does. The compiler goes on to do this for all of your files and keeps track of what functions are defined in each file. Note that it never found the definition Nowafunkcja, because the compiler never compiled przerwania.c. It did however find the declaration in the .h (because main.c told it exactly where to find the .h)

The linker then gets this stuff from the compiler, including what functions have been defined in all your .c files. That's the first point where something tries to answer the question "Now what code do I actually need to run when he asked me to Nowafunkcja()?". So that's the first point in the build when the tools realized, I never found code for Nowafunkcja in any of the .c files I was looking in.

So, I think that roughly answers "Why", but we need to know more about your project organization to give you a "fix" to make it work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM