2012-06-19 3 views
1

У меня возник вопрос о создании статических библиотек, которые используют другие статические библиотеки.Статические библиотеки, которые зависят от других статических библиотек

Я создал пример с тремя файлами - main.cpp, slib1.cpp и slib2.cpp. slib1.cpp и slib2.cpp скомпилированы как отдельные статические библиотеки (например, я заканчиваю slib1.a и slib2.a) main.cpp скомпилирован в стандартный исполняемый файл ELF, связанный с обеими библиотеками.
Существует также заголовочный файл с именем main.h, который прототипирует функции в slib1 и slib2.

main.cpp вызывает функцию lib2func() из slib2. Эта функция, в свою очередь, вызывает lib1func() из slib1.

Если я скомпилирую код как есть, g ++ вернется с ошибкой компоновщика, заявив, что не может найти lib1func() в slib1. Однако, если я звоню в lib1func() ПЕРЕД вызовом любых функций в slib2, код компилируется и работает правильно.

Мой вопрос заключается в следующем: возможно ли создать статическую библиотеку, которая зависит от другой статической библиотеки? Казалось бы, это очень серьезное ограничение, если это невозможно.

Исходный код для этой проблемы прилагается ниже:

main.h:

#ifndef MAIN_H 
#define MAIN_H 

int lib1func(); 
int lib2func(); 

#endif 

slib1.cpp:

#include "main.h" 

int lib1func() { 
    return 1; 
} 

slib2.cpp:

#include "main.h" 

int lib2func() { 
    return lib1func(); 
} 

main.cpp:

#include <iostream> 
#include "main.h" 

int main(int argc, char **argv) { 
    //lib1func(); // Uncomment and compile will succeed. WHY?? 

    cout << "Ans: " << lib2func() << endl; 
    return 0; 
} 

выход НКУ (с линией закомментирована):

g++ -o src/slib1.o -c src/slib1.cpp 
ar rc libslib1.a src/slib1.o 
ranlib libslib1.a 
g++ -o src/slib2.o -c src/slib2.cpp 
ar rc libslib2.a src/slib2.o 
ranlib libslib2.a 
g++ -o src/main.o -c src/main.cpp 
g++ -o main src/main.o -L. -lslib1 -lslib2 
./libslib2.a(slib2.o): In function `lib2func()': 
slib2.cpp:(.text+0x5): undefined reference to `lib1func()' 
collect2: ld returned 1 exit status 

выход НКУ (с линией незакомментированной)

g++ -o src/slib1.o -c src/slib1.cpp 
ar rc libslib1.a src/slib1.o 
ranlib libslib1.a 
g++ -o src/slib2.o -c src/slib2.cpp 
ar rc libslib2.a src/slib2.o 
ranlib libslib2.a 
g++ -o src/main.o -c src/main.cpp 
g++ -o main src/main.o -L. -lslib1 -lslib2 

$ ./main 
Ans: 1 

ответ

3

Пожалуйста, попробуйте g++ -o main src/main.o -L. -Wl,--start-group -lslib1 -lslib2 -Wl,--end-group.

Группа, определяемая с помощью --start-group, --end-group, помогает решать круговые зависимости между библиотеками.

Смотрите также: GCC: what are the --start-group and --end-group command line options?

2

Порядок сделать разницу. Вот из gcc(1) страницы вручную:

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.
+0

Можно даже иметь циклические зависимости между библиотеками. В таких случаях вам нужно предоставить одну из библиотек дважды в командной строке. –

+0

Или используйте параметры компоновщика, как предлагает @Ruben. –

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