如何让CMake不使用-Wl,-Bdynamic以生成静态可执行文件?
解决CMake自动添加-Wl,-Bdynamic的问题
要让CMake停止在链接命令末尾添加-Wl,-Bdynamic,可以通过以下几种方式处理:
全局强制静态链接
在CMakeLists.txt中设置全局链接器标志,替代直接在target_link_libraries中添加-static:set(CMAKE_EXE_LINKER_FLAGS "-static")这种方式会让所有可执行目标默认使用静态链接,CMake不会再自动插入动态链接恢复的
-Wl,-Bdynamic参数。针对特定目标设置静态链接选项
如果只需要给单个目标启用静态链接,使用target_link_options直接传递链接器参数,比target_link_libraries更精准:target_link_options(你的目标名称 PRIVATE "-static")该命令会直接将
-static传递给链接器,避免CMake在处理库依赖时自动切换回动态链接模式。强制优先查找静态库
配合静态链接标志,设置CMake优先搜索静态库文件,确保所有依赖都使用静态版本,从根源上消除切换动态链接的需求:set(CMAKE_FIND_LIBRARY_SUFFIXES .a) set(CMAKE_EXE_LINKER_FLAGS "-static")
原理说明:CMake默认会在链接某些系统依赖时自动添加-Wl,-Bdynamic来恢复动态链接的默认行为,通过显式设置全局或目标级别的静态链接标志,可以覆盖这个默认逻辑,让整个链接过程保持静态模式。
内容的提问来源于stack exchange,提问作者John Graham
相关产品推荐
相关产品推荐

