Я пытаюсь связать две библиотеки libA.a и libB.a вместе с файлом main.c. libB имеет зависимости от libA, а у основных есть зависимости от обоих.Межзависимости между статическими библиотеками
Я могу скомпилировать библиотеки самостоятельно, но когда я пытаюсь связать их вместе для создания окончательного исполняемого файла, я получаю сообщение об ошибке, ссылающееся на функции A на B.
Есть ли способ рассказать компоновщику для поиска этих функций в libA?
- Я собираюсь запустить этот код на FreeRTOS на Cortex-M3 MCU, поэтому статическим связыванием является мой единственный вариант.
- Я действительно хочу, чтобы это удалось без изменения процесса компиляции для libB.
Существует аналогичный вопрос на этом [ссылка] (Dynamic Linking of Shared Libraries with Dependencies «Dynamic Linking разделяемых библиотек с зависимостями»), но, как я сказал, динамическое связывание не вариант.
По просьбе Офек игрушка кода (игнорировать функциональность и синтаксические ошибки, если таковые имеются) -
Lība
int libA_fun1()
{ return stuff; }
int libA_fun2()
{ return something_else; }
libB
#include <libA.h>
int libB_fun1()
{
//do stuff
int x = libA_fun1();
return something;
}
main.c
#include <libA.h>
#include <libB.h>
int main()
{
printf("%d", libA_fun2() * libB_fun1());
return 0;
}
Я строю libA.a и libB.a. Наконец
gcc main.c -lA -lB -LPathA -LPathB
выдает ошибку: неопределенная ссылку на libA_fun1 в libB_filexx.c, линия ой
Однако функция правильно определена в libA.h
Этот сценарий полностью поддерживается. Можете ли вы разместить точное сообщение об ошибке? Еще лучше - код игрушки, демонстрирующий ошибку связи? –
@OfekShilon - я обновил пример – TSG
Что вы делаете, вообще говоря, должно быть прекрасно (при условии, что нет круговых зависимостей), поэтому я бы посмотрел, чтобы строить настройки в противном случае. Это глупая догадка, но я был укушен еще много лет назад из-за линкера. Попробуйте изменить порядок, в котором вы связываете 'main' с' A' и 'B'. Пример: 'gcc main.c -lB -lA -LPathB -LPathA' –