我正在尝试用CMake 3.15制作一个静态的可执行文件。我构建在Alpine上(因此使用了musl),目前,我的可执行文件的ldd输出是:
# ldd my_executable
/lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fc6f65b3000)
libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fc6f659f000)我可以设置target_link_options(my_executable PRIVATE -static-libgcc -static-libstdc++),它们可以静态链接:
# ldd my_executable
/lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)但我无法让musl静态链接。我尝试过(使用干净的构建,以确保配置步骤从零开始):
在调用above.
set(CMAKE_EXE_LINKER_FLAGS "-static") add_executable(my_executable ...)
-static之前,-static添加到target_link_options 当我在CMake模式下运行VERBOSE=1时,它总是以以下方式结束链接命令:
... -Wl,-Bdynamic -ldl -lrt -lm -lpthread我相信这是我的问题:我想摆脱那个-Bdynamic。我遗漏了什么?这个-Bdynamic来自我的依赖项之一吗?我将它们全部构建为静态(.a)库,那么它们如何动态链接libc呢?或者,当我构建-static时,是否需要对它们进行修补以添加它们呢?
发布于 2020-05-15 08:51:09
正如KamilCuk的评论所暗示的那样,答案here似乎有解决方案。尽管如此,我并没有做完全相同的事情,所以我也会保留这个答案。
对于我希望静态链接的目标可执行文件:
add_executable(my_executable main.cpp)我必须设置以下属性/选项:
set_target_properties(my_executable PROPERTIES LINK_SEARCH_START_STATIC ON)
set_target_properties(my_executable PROPERTIES LINK_SEARCH_END_STATIC ON)
target_link_options(my_executable PRIVATE -static-libgcc -static-libstdc++ -static)一些注意事项:
LINK_SEARCH_*_STATIC对于从链接命令中删除-Bdynamic很有用。used).ldd -ldl,但似乎dl最终没有得到链接(大概是因为used).ldd不足以验证my_executable是静态链接的。readelf -l my_executable显示它没有INTERP头,目前没有动态二进制(使用musl)。https://stackoverflow.com/questions/61799147
复制相似问题