Привет всем.
Во-первых, я хотел бы представить мою проблему всем вам!
Я использую Atollic TrueStudio для разработки встраиваемой системы. В этой системе у меня есть слой драйвера (построенный как статическая библиотека. Эта библиотека в основном содержит STM32 HAL, и эта библиотека содержит МНОГО слабых функций).
Эта библиотека компилируется с ARM GCC и прекрасно работает. Я могу связать его в других проектах, и он работает как надо.
Вторая часть - это проблема, потому что я хочу реализовать модульное тестирование в проекте!
Для этого я создал другую конфигурацию для той же статической библиотеки Driver Layer (с кодом HAL STM32), но на этот раз я собираю ее с MinGW.
Компиляция работает, но когда я пытаюсь связать эту библиотеку с другим проектом (исполняемый проект). Компоновщик возвращает «неопределенную ссылку на ...» (изображение ниже).
PS: проблема с компоновщиком, так как проект находит, где объявлена слабая функция. Хотя он не может найти, где он определен!
Редактировать
Это основной код
#include <MbedOS/platform/mbed_error.h>
int main(void)
{
error("Stream obj failure, errno=%d\r\n",
return 0;
}
Здесь определяется функция (внутри статической библиотеки) mbed_error.c
#include <MbedOS/platform/mbed_error.h>
static uint8_t error_in_progress = 0;
WEAK void error(const char* format,
...)
{
// Prevent recursion if error is called again
if (error_in_progress)
{
return;
}
error_in_progress = 1;
#ifndef NDEBUG
va_list arg;
va_start(arg,
format);
mbed_error_vfprintf(format,
arg);
va_end(arg);
#endif
exit(1);
}
Это файл mbed_error.h
#ifdef __cplusplus
extern "C"
{
#endif
void error(const char* format,
...);
#ifdef __cplusplus
}
#endif
И это результат с консоли
13:45:44 **** Build of configuration Debug for project testeLINKER ****
make all
gcc -o "testeLINKER.elf" ./src/main.o -lSTM32F7_Driver_Layer -L"E:\TrueStudio_Projects\STM32F7_Driver_Layer\Projeto\TrueStudio\UnitTestLibrary"
./src/main.o: In function `main':
E:\TrueStudio_Projects\testeLINKER\Debug/../src/main.c:33: undefined reference to `error'
collect2.exe: error: ld returned 1 exit status
make: *** [testeLINKER.elf] Error 1
13:45:44 Build Finished (took 460ms)
Редактировать 2
Далее выводится нм для статической библиотеки (только один из файлов со слабой функцией)
C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.0.0\PCTools\bin>nm E:\TrueStudio_Projects\STM32F7_Driver_Layer\Projeto\TrueStudio\UnitTestLibrary\Source\MbedOS\platform\mbed_error.o
00000000 b .bss
00000000 d .data
00000000 N .debug_abbrev
00000000 N .debug_aranges
00000000 N .debug_info
00000000 N .debug_line
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T .weak._error.
w _error
00000000 b _error_in_progress
U _exit
U _mbed_error_vfprintf