Linux, статическая библиотека, ссылающаяся на другую статическую библиотеку в исполняемом файле - PullRequest
3 голосов
/ 17 апреля 2010

Я создаю приложение, которое состоит из двух статических библиотек и исполняемого файла.

Давайте назовем две статические библиотеки: libusefulclass.a libcore.a

и приложение: MyApp

libcore создает и использует класс, определенный в libusefulclass (назовем его UsefulClass)

Теперь, если я свяжу приложение следующим образом:

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o -lusefulclass -lcore

Компоновщик жалуется на то, что методы в libusefulclass не найдены:

undefined reference to `UsefulClass::foo()'

и т.д.

Я нашел обходной путь для этого: Если UsefulClass также создается в исходных файлах самого исполняемого файла, приложение связывается без проблем.

Мой вопрос: есть ли более чистый способ заставить libcore ссылаться на методы, определенные в libusefulclass, или статические библиотеки просто не могут быть связаны друг с другом?

ТИА

P.S .: В случае, если это имеет значение: приложение разрабатывается на C ++ с использованием Qt, но я чувствую, что это не проблема Qt, а проблема библиотеки в целом.

1 Ответ

6 голосов
/ 17 апреля 2010

Вам нужно указывать библиотеки в обратном порядке зависимостей, поэтому используйте

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o  -lcore -lusefulclass

Если есть циклическая зависимость, вам даже может потребоваться указать библиотеку дважды,

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o  -lusefulclass -lcore -lusefulclass
...