我正在尝试使用CMake 3.15制作静态可执行文件。我正在Alpine Linux上构建(因此带有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静态链接。我尝试过(使用干净的版本,以确保配置步骤从零开始):
-static
添加到上面的target_link_options
。set(CMAKE_EXE_LINKER_FLAGS "-static")
在调用add_executable(my_executable ...)
之前-static
添加到target_link_libraries(my_executable lib1 lib2 -static)
当我在VERBOSE=1
模式下运行CMake时,它总是以以下形式结束链接命令:
... -Wl,-Bdynamic -ldl -lrt -lm -lpthread
我相信这是我的问题:我想摆脱那个-Bdynamic
。我想念什么?此-Bdynamic
来自我的依赖项之一吗?我从源头将它们全部构建为静态(.a
)库,那么它们如何动态链接libc?还是在构建它们时需要修补它们以添加-static
?
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
是有用的。
-ldl
,但似乎dl
最终没有获得链接(大概是因为它未被使用)。ldd
不足以验证my_executable
是静态链接的。 readelf -l my_executable
表明它没有INTERP
标头,并且没有它,就没有动态二进制文件(使用musl)。