Мне нужна помощь с компиляцией C ++, так как я явно что-то упускаю.
Я создал библиотеку .so (назовем ее mylib) в зависимости от другой библиотеки .so, которую я написал (mylib2) и какой-то простой программы, использующей ее. Также вторая библиотека зависит от ANTLR. я использую CMake для сборки обеих библиотек, и они прекрасно компилируются и устанавливаются. Но когда я пытаюсь скомпилировать программу:
cmd> g++ program.cpp -lmylib
я получил
/usr/local/lib/libmylib2.so.0: undefined reference to `antlr::CharScanner::traceOut(char const*)'
ANTLR выглядит как статическая библиотека, поэтому я попытался
cmd> g++ program.cpp -lmylib -Wl,-Bstatic -lantlr
Но тогда все, что я получаю, это
/usr/bin/ld: cannot find -lgcc_s
У меня есть два вопроса здесь:
1) Почему mylib2 не видит antlr? Я должен упомянуть, что я использую свой собственный скрипт cmake find, это может быть проблемой?
find_package(ANTLR REQUIRED)
include_directories(${ANTLR_INCLUDE_DIR})
2) Что означает вторая ошибка? Почему я не могу найти libgcc_s?
Я буду очень признателен за любую помощь.
РЕДАКТИРОВАТЬ
Я должен отметить, что я использую ANTLR 2.7
От man ld
(GNU ld): -Bstatic
— Не связывайтесь с общими библиотеками. Вы можете использовать эту опцию несколько раз в командной строке: она влияет на поиск в библиотеке параметров -l, которые следуют за ней. Поэтому вы должны вручную включить использование динамических библиотек после -lantlr
, Пожалуйста, помните, что связывание статической библиотеки не компилируется с -fPIC
опция может привести к не перемещаемому коду и более длительному времени запуска приложения http://www.airs.com/blog/archives/41
Других решений пока нет …