首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“未定义的提及”不知道为什么?

“未定义的提及”不知道为什么?
EN

Stack Overflow用户
提问于 2014-06-05 20:46:58
回答 1查看 3.4K关注 0票数 2

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

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

CooCox中的错误如下所示:

代码语言:javascript
复制
[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

C很长,因为我在这里有一些长函数的定义,所以我只粘贴了一部分

代码语言:javascript
复制
 #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

代码语言:javascript
复制
#ifndef __przerwaniah
#define __przerwaniah



void Nowafunkcja(void);



#endif

przerwania.c

代码语言:javascript
复制
#include "przerwania.h"


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

你知道有什么问题吗?我从昨天起就在想这件事,很奇怪:/我会感谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-05 20:55:27

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

我不知道您当前的文件/文件夹结构是什么样子:config.html可以帮助您确定如何将这些新文件拖到构建中。

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

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

因此,我认为这大致回答了“为什么”,但我们需要更多地了解您的项目组织,给您一个“修复”,使其工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24069973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档