如何使用CMake安装GCC运行时库?

Vla*_*hin 4 gcc mingw cmake

我已经编译了一个C++程序,它在我的计算机上运行得非常好,但是如果我的朋友试图启动该程序,它libgcc_s_sw2-1.dll就会丢失.如何使用CMake将所有必需的GCC运行时库包含在程序中?

rub*_*nvb 5

所有使用 GCC 编译的程序都需要 libgcc dll。如果您不想在程序中重新分发此 DLL,则必须通过传递-static给链接器或在 CMake 中进行静态链接:

CMAKE_EXE_LINKER_FLAGS=-static
Run Code Online (Sandbox Code Playgroud)

这是 GCC 特有的。


And*_*dré 5

正如rubenvb正确回答:libgcc是必需的,或者你应该添加CMAKE_EXE_LINKER_FLAGS=-static到你的CMakeLists.txt.

作为替代方案,您可以尝试在MinGW安装中找到libgcc_s_sw2-1.dll,并使用InstallRequiredSystemLibraries将其与您的安装"打包" .这也与CPack很好地集成.

例如,在我自己的代码中,我有:

if( MINGW )
    message( STATUS "    Installing system-libraries: MinGW DLLs." )
    get_filename_component( Mingw_Path ${CMAKE_CXX_COMPILER} PATH )
    set( CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS ${Mingw_Path}/mingwm10.dll ${Mingw_Path}/libgcc_s_dw2-1.dll ${Mingw_Path}/libstdc++-6.dll )
endif( MINGW )
include( InstallRequiredSystemLibraries )
Run Code Online (Sandbox Code Playgroud)

稍后,在准备安装或包的部分:

# Actually install it when make install is called.
# Note, this works with CPack
if( CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS )
    install( PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT System )
endif( CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS )
Run Code Online (Sandbox Code Playgroud)