【问题标题】:"Undefined reference to" no idea why?“未定义的引用”不知道为什么?
【发布时间】:2014-07-27 00:34:30
【问题描述】:

我正在为我的学校开发一个 stm32f4 项目。我正在使用 CooCox IDE。

我想添加新文件“przerwania.c”和“przerwania.h”来在那里编写一些函数——而不是在“main.c”中。但我不知道为什么 CooCox 向我显示错误。 早些时候我想将一些函数从 main.c 移动到 pwm.c 并且它们可以工作!但是我想做一个新文件,因为我有更多的功能。

CooCox 中的错误如下所示:

[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 很长,因为我在那里定义了一些长函数,所以我在这里只粘贴了一部分

 #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;
    }


}

和文件: przerwania.h

#ifndef __przerwaniah
#define __przerwaniah



void Nowafunkcja(void);



#endif

przerwania.c

#include "przerwania.h"


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

你知道问题出在哪里吗?从昨天开始我就在考虑这个问题:/ 感谢您的帮助!

【问题讨论】:

  • 我已经很久没有使用C了,但是看起来przerwania.c没有被编译。这与错误消息一致,并且您编译命令行的事实并未将此类文件显示为输入。
  • 老实说,我总是遇到编译器问题……你知道该怎么做吗?
  • 看coocox手册/教程?我从未使用过它,但可能您有办法将文件添加到“项目”或 IDE 使用的任何术语。

标签: c reference include stm32 coocox


【解决方案1】:

看看[cc] 12 total files to be compiled.下的那一行 当您添加 pwm.c 时,您还通知编译器包含此文件。你会看到它列在那里。 przerwania.c 不是。 如果您以与添加 pwm 相同的方式添加 przerwania,您的 IDE 将负责确保它包含在构建中。

我不确定您当前的文件/文件夹结构是什么样的: http://www.coocox.org/CoIDE/Project_management_config.html 可以帮助您确定如何将这些新文件拉入构建中。

FWIW: (拟人化的)编译器步骤说:这是有效的代码吗?因此,它查看您的 main.c,发现您包含 przerwania.h,并得出您正确使用 Nowafunkcja 函数的结论(仅匹配签名)。即使在这一点上,它还没有查看 przerwania.c 来了解它的作用。编译器继续为您的所有文件执行此操作,并跟踪每个文件中定义的函数。请注意,它从未找到 Nowafunkcja 的定义,因为编译器从未编译过 przerwania.c。但是它确实在 .h 中找到了声明(因为 main.c 告诉它在哪里可以找到 .h)

然后链接器从编译器获取这些内容,包括在所有 .c 文件中定义的函数。这是试图回答“现在当他要求我使用 Nowafunkcja() 时我实际上需要运行什么代码?”这个问题的第一点。因此,当工具实现时,这是构建中的第一点,我从未在我正在查看的任何 .c 文件中找到 Nowafunkcja 的代码。

所以,我认为这大致回答了“为什么”,但我们需要更多地了解您的项目组织,以便为您提供“修复”以使其发挥作用。

【讨论】:

  • 但问题是我没有对 pwm.c 和 pwm.h 做更多类似的事情,只需在 main.c 中添加#include "pwm.h"
  • 具体来说,您可能想查看the section about adding paths。你能解释一下你的文件/文件夹组织吗?我怀疑新文件不在编译器正在查找的文件夹中。
  • 非常感谢这么长的回答,但我不得不承认我只是打开了一个新项目并制作了新文件并复制了所有代码......现在它可以工作了!
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多