gpt4 book ai didi

c++ - 如何正确构建静态库?

转载 作者:行者123 更新时间:2023-11-28 03:34:54 25 4
gpt4 key购买 nike

我使用 log4cxx 日志库。我需要链接到它的静态版本以避免额外的二进制依赖。我在我的动态库中使用它。 log4cxx 的默认构建生成静态库,但我无法链接它,因为它是在没有 -fPIcflags的情况下编译的。所以我将 log4cxx bulding 更改为:

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

因此,我收到了一个可以与我的 .so 库链接的 liblog4cxx.a。链接由 Cmake 完成,类似于:

target_link_libraries(my_dynamic_lib log4cxx)
link_directories(relative_path_to_dir_where_liblog4cxx.a_lives)

在运行时之前一切看起来都很好。由于 undefined symbol "logger"

,我无法加载 my_dynamic_lib.so

请向我解释问题出在哪里以及如何解决这个问题。

谢谢

最佳答案

您可以通过使用验证共享库是否包含该符号

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,而不是动态库。

关于c++ - 如何正确构建静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com