2014-06-05 47 views
2

我正在爲我的學校開發一個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中是相當長的becouse我有很少長函數有一些定義,所以我在這裏貼只是一部分

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

你有什麼想法是什麼問題?我從昨天開始考慮這件事,並感謝你的幫助!

+0

自從我和C一起工作已經很長時間了,但看起來像'przerwania.c'沒有被編譯。這與錯誤消息一致,並且您編譯命令行的事實不會將這樣的文件顯示爲輸入。 – SJuan76

+0

說實話,我總是遇到編譯器的問題......你可能有ani的想法該怎麼做? – wiwo

+1

看看coocox手冊/教程?我從來沒有使用它,但可能你有一種方法將文件添加到「項目」或IDE使用的任何術語。 – SJuan76

回答

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: (anthropomorphized)編譯器步驟說:這個有效的代碼是什麼?所以它看起來雖然你的main.c,看到你包含przerwania.h,並得出你正確使用Nowafunkcja函數(只是匹配簽名)的結論。儘管在這一點上,它並沒有研究przerwania.c來了解它的功能。編譯器繼續爲您的所有文件執行此操作,並跟蹤每個文件中定義的功能。請注意,它從來沒有找到定義Nowafunkcja,因爲編譯器從未編譯過przerwania.c。它確實在.h中找到了聲明(因爲main.c告訴它到底在哪裏可以找到.h)

然後鏈接器從編譯器中獲取這些東西,包括在你所有的.c文件中定義了哪些函數文件。這是第一個嘗試回答這個問題的點:「現在當我問Nowafunkcja()時,我真的需要運行哪些代碼?」。所以這是工具實現時的第一個構建點,我從未在任何.c文件中找到Nowafunkcja的代碼。

所以,我認爲粗略回答「爲什麼」,但我們需要了解更多關於您的項目組織的信息,以便爲您提供「修復」以使其發揮作用。

+0

但問題在於我沒有做任何事情,比如使用pwm.c和pwm.h做更多的事情,只需在main.c – wiwo

+0

中添加#include「pwm.h」,具體來說,您可能想查看[有關添加路徑的部分] (http://www.coocox.org/CoIDE/Project_management_config.html#AddPaths)。你能解釋一下你的文件/文件夾組織嗎?我懷疑新文件不在編譯器正在查找的文件夾中。 – anregen

+0

非常感謝這麼長的答案,但我不得不承認,我只是打開一個新的項目,並創建新的文件並複製所有的代碼......現在它的工作原理! – wiwo

相關問題