2012-06-27 45 views
0

我使用log4cxx日志库。我需要链接到它的静态版本,以避免额外的二进制依赖。我在我的动态库中使用它。 log4cxx的默认构建生成静态库,但我无法链接它,因为它是用w/o -fPIC标志编译的。如何正确构建静态库?

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

结果我收到了liblog4cxx.a,我可以用我的.so库链接:所以当我改变log4cxx BULDING。链接由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 - >未定义)。 –

回答

1

您可以验证共享库是否包含符号,如果此行显示与符号类型U这意味着它是不确定的使用

nm -g my_dynamic_lib.so | grep logger 

通常共享库不会解析所有需要的符号直到运行时,所以有可能(并且完全正常)将共享库链接到缺少的符号。

如果你把-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。我不认为你可以像你的例子那样链接,除非你可以提供其他文档。