2015-05-28 4 views
0

Я пытаюсь связать две библиотеки libA.a и libB.a вместе с файлом main.c. libB имеет зависимости от libA, а у основных есть зависимости от обоих.Межзависимости между статическими библиотеками

Я могу скомпилировать библиотеки самостоятельно, но когда я пытаюсь связать их вместе для создания окончательного исполняемого файла, я получаю сообщение об ошибке, ссылающееся на функции A на B.

Есть ли способ рассказать компоновщику для поиска этих функций в libA?

  1. Я собираюсь запустить этот код на FreeRTOS на Cortex-M3 MCU, поэтому статическим связыванием является мой единственный вариант.
  2. Я действительно хочу, чтобы это удалось без изменения процесса компиляции для 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

+0

Этот сценарий полностью поддерживается. Можете ли вы разместить точное сообщение об ошибке? Еще лучше - код игрушки, демонстрирующий ошибку связи? –

+0

@OfekShilon - я обновил пример – TSG

+0

Что вы делаете, вообще говоря, должно быть прекрасно (при условии, что нет круговых зависимостей), поэтому я бы посмотрел, чтобы строить настройки в противном случае. Это глупая догадка, но я был укушен еще много лет назад из-за линкера. Попробуйте изменить порядок, в котором вы связываете 'main' с' A' и 'B'. Пример: 'gcc main.c -lB -lA -LPathB -LPathA' –

ответ

0

Благодаря @Ike предложившему исправления который работал.

Короче:

If any [static] library B depends on symbols defined in library A, then library B should appear first in the list supplied to the linker. A more detailed explaination can be found here .

Порядок, в котором librries появляются линкера важно также и то, где моя команда была связь не удается.

Смежные вопросы