[英]“Undefined reference to” no idea why?
我正在為我的學校從事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
}
你知道是什么問題嗎? 自昨天以來,我一直在考慮這個問題://感謝您的幫助!
看一下[cc] 12 total files to be compiled.
下的一行[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的代碼。
因此,我認為這大致可以回答“為什么”,但是我們需要更多地了解您的項目組織,以便為您提供“解決方案”以使其正常運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.