2012-06-27 4 views
0

Я использую журнал регистрации log4cxx. Мне нужно связать со своей статической версией, чтобы избежать дополнительных бинарных зависимостей. Я использую его в своей динамической библиотеке. По умолчанию сборка log4cxx создает статическую библиотеку, но я не могу связать ее, потому что она была скомпилирована без флага -fPIC. Поэтому я изменил log4cxx Bulding как:Как правильно построить статическую библиотеку?

CPPFLAGS="-fPIC -static" ./configure 
make 

В результате я получил liblog4cxx.a что я могу связать с моей .so библиотеки. Связывание было сделано Cmake, что-то вроде:

target_link_libraries(my_dynamic_lib log4cxx) 
link_directories(relative_path_to_dir_where_liblog4cxx.a_lives) 

Все выглядело отлично до времени исполнения. Я не могу загрузить my_dynamic_lib.so из-за undefined symbol "logger"

Пожалуйста, объясните мне, что случилось и как решить эту проблему.

благодаря

+0

Привет, Вы уверены, что библиотека liblog4cxx.a имеет символ журнала? Я не знаю, какую ОС вы используете, но если вы используете Linux, попробуйте эту команду, чтобы проверить, есть ли проблема в этой библиотеке или где-то еще: nm liblog4cxx.a | grep "logger" Это должно выводить символы, определенные в этой библиотеке с регистратором на его имя. Проверьте, установлен ли регистратор и тип символа (не должен быть U -> undefined). –

ответ

1

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

nm -g my_dynamic_lib.so | grep logger 

Если показано с типом U символ это означает, что он не определен.

Обычно общая библиотека не будет разрешать все символы, которые ей нужны, до времени выполнения, поэтому возможно (и совершенно нормально) связывать общую библиотеку с отсутствующими символами.

Если поставить -llog4cxx в начале командной строки компоновщика для my_dynamic_lib.so, то он не будет ссылаться на любой код там, и оставит logger символа нерешенного до времени выполнения. Для того, чтобы заставить его использовать символы в статической библиотеке убедитесь, что список статической библиотеки после объектов, которые нуждаются в ней:

g++ -fPIC -shared -o my_dynamic_lib.so obj1.o obj2.o -llog4cxx ... 

Я не знаю, как сделать это с CMake, но это выглядит хотя ваш CMakefile ссылается только на log4cxx при связывании основного исполняемого файла, а не с динамической библиотекой.

1

Обычно вы связать liblog4cxx.a с исполняемым файлом, а не с my_dynamic_lib.so. Я не думаю, что вы можете ссылаться, как в вашем примере, если вы не можете предоставить документацию, в которой говорится иначе.

Смежные вопросы