链接器优化共享库
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
。以上是关于链接器优化共享库的主要内容,如果未能解决你的问题,请参考以下文章