Динамические и статические библиотеки C ++, связанные с CMake

0

Мне нужна помощь с компиляцией 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

Теги:
cmake
antlr
ld

1 ответ

1
Лучший ответ

От man ld (GNU ld): -Bstatic - Не -Bstatic с общими библиотеками. Вы можете использовать эту опцию несколько раз в командной строке: она влияет на поиск библиотеки для параметров -l, которые следуют за ней. Таким образом, вы должны вручную включить динамические библиотеки после -lantlr. Пожалуйста, помните, что -fPIC на статическую библиотеку, не скомпилированную с параметром -fPIC может привести к неперемещаемому коду и более длительному времени запуска приложения. Http://www.airs.com/blog/archives/41

  • 0
    Спасибо за быстрый ответ :) Но когда я набираю g ++ test.cpp -lmylib -Wl, -Bstatic -lantlr -Wl, -Bdynamic, я все равно получаю ошибки «неопределенная ссылка». Кроме того, есть ли способ включить antlr в mylib2, поэтому мне не нужно было бы указывать его в каждой программе, использующей mylib?
  • 0
    Ну, грубо говоря, разделяемая библиотека в Linux (ELF) почти не отличается от других двоичных файлов ELF, поэтому, да, вы можете скомпилировать ее так: gcc -shared -o libmylib2.so mylib2_obj1.o mylib2_obj2.o /path/to/libantlr.a ... Но на самом деле я бы ссылался на динамическую версию libantlr, если она существует в системе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню