"Неопределенная ссылка на" не знаю почему?

Я работаю над проектом для 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
}

Ты хоть представляешь в чем проблема? Я думаю об этом со вчерашнего дня и его странность:/ Я буду признателен за вашу помощь!

1 ответ

Решение

Посмотрите на строку под [cc] 12 total files to be compiled.Когда вы добавили pwm.c, вы также сообщили компилятору о включении этого файла. Вы увидите это в списке там. przerwania.c нет. Если вы добавите przerwania так же, как вы добавили pwm, ваша 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()?". Так что это первый момент в сборке, когда инструменты реализованы, я никогда не находил код для Nowafunkcja ни в одном из файлов.c, которые я искал.

Итак, я думаю, что это примерно отвечает "Почему", но нам нужно больше знать о вашей организации проекта, чтобы дать вам "починку", чтобы она заработала.

Другие вопросы по тегам