У меня возник вопрос о создании статических библиотек, которые используют другие статические библиотеки.Статические библиотеки, которые зависят от других статических библиотек
Я создал пример с тремя файлами - 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
Можно даже иметь циклические зависимости между библиотеками. В таких случаях вам нужно предоставить одну из библиотек дважды в командной строке. –
Или используйте параметры компоновщика, как предлагает @Ruben. –