Мне нужна помощь с компиляцией 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 кажется статическим lib, поэтому я попробовал
cmd> g++ program.cpp -lmylib -Wl,-Bstatic -lantlr
Но тогда все, что я получаю, это
/usr/bin/ld: cannot find -lgcc_s
У меня здесь два вопроса:
1) Почему mylib2 не может видеть antlr? Я должен упомянуть, что я использую свой собственный сценарий поиска cmake, может это проблема?
find_package(ANTLR REQUIRED)
include_directories(${ANTLR_INCLUDE_DIR})
2) Что означает вторая ошибка? Почему я не могу найти libgcc_s?
Я буду очень признателен за любую помощь.
РЕДАКТИРОВАТЬ
Я должен упомянуть, что я использую ANTLR 2.7
От man ld
(GNU ld): -Bstatic
- Не -Bstatic
с общими библиотеками. Вы можете использовать эту опцию несколько раз в командной строке: она влияет на поиск библиотеки для параметров -l, которые следуют за ней. Таким образом, вы должны вручную включить динамические библиотеки после -lantlr
. Пожалуйста, помните, что -fPIC
на статическую библиотеку, не скомпилированную с параметром -fPIC
может привести к неперемещаемому коду и более длительному времени запуска приложения. Http://www.airs.com/blog/archives/41
gcc -shared -o libmylib2.so mylib2_obj1.o mylib2_obj2.o /path/to/libantlr.a
... Но на самом деле я бы ссылался на динамическую версию libantlr, если она существует в системе.