链接器优化共享库

Posted

技术标签:

【中文标题】链接器优化共享库【英文标题】:Linker optimizing out shared library 【发布时间】:2020-03-13 10:58:23 【问题描述】:

使用 CMake 和 gcc/clang 编译器我想从这个文件 (Registrator.cpp) 创建一个共享库:

#include ...

namespace


struct Registrator

    Registrator()
    
        ...
    
    ~Registrator()
    
        ...
    
 g_registrator [[gnu::used, gnu::visibility("default")]];

 // namespace

此对象未在其他任何地方使用。它的职责仅仅是在它的(解)构建过程中做一些事情。

当定义为:

add_library($libname OBJECT Registrator.cpp)

这是一种防止链接器优化此 TU 的方法,就像在 OBJECT 情况下,所有源都进入最终可执行文件。

但是,我也希望能够将其用作SHARED 库。在以下情况下:

add_library($libname SHARED Registrator.cpp) 

该库根本没有链接,不幸的是gnu::visibility("default") 并没有完全删除它。

有什么方法可以实现吗?提前感谢您的帮助。

干杯:)

【问题讨论】:

【参考方案1】:

假设使用 g++,您可以禁用 --as-needed 链接行为。这是默认启用的,这可能会导致您看到的问题。尝试使用 CMake 的 target_link_options() 命令传递链接标志以禁用它:

add_library($libname SHARED Registrator.cpp)
target_link_options($libname PUBLIC "-Wl,--no-as-needed")

【讨论】:

您好,谢谢您的回复。使用 target_link_options() 命令有效,但是它将此标志应用于我链接的所有其他库,例如。 gcc -Wl,--no-as-needed $libname MyOtherLib 也会将链接器选项应用于 MyOtherLib。我想避免这种行为。有没有办法在图书馆级别应用这个标志? 您可以尝试使用PRIVATE 关键字,而不是PUBLIC

以上是关于链接器优化共享库的主要内容,如果未能解决你的问题,请参考以下文章

静态和共享库链接器错误

修改 glibc 动态链接器以检查共享库是不是已在另一个进程中加载

gcc 链接器库搜索顺序;路径加静态与共享

C 库的 C++ 包装器作为共享库

CMake - 更改共享库链接选项

Linux:链接共享库时如何使用 .pc 文件?