1

我使用 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"

请解释我出了什么问题以及如何解决这个问题。

谢谢

4

2 回答 2

2

您可以使用以下方法验证共享库是否包含符号

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在链接主可执行文件时链接到,而不是动态库。

于 2012-06-27T14:57:37.537 回答
1

通常你会将 liblog4cxx.a 与你的可执行文件而不是你的 my_dynamic_lib.so 链接。我认为您不能像示例中那样进行链接,除非您可以提供另有说明的文档。

于 2012-06-27T14:37:51.287 回答