Неопределенная ссылка на слабые функции (Статическая библиотека + GCC) - PullRequest
0 голосов
/ 30 апреля 2018

Привет всем. Во-первых, я хотел бы представить мою проблему всем вам!

Я использую 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

1 Ответ

0 голосов
/ 08 мая 2018

Для всех, у кого могут быть такие же сомнения, как у меня Вот ответ.

Проблема в том, что формат файла PE32 не поддерживает слабую связь.

...