【问题标题】: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") 并没有完全删除它。

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

干杯:)

【问题讨论】:

    标签: c++ gcc cmake


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多