我已经编译了一个C ++程序,它在我的计算机上完美运行,但如果我的朋友试图启动该程序,它会说libgcc_s_sw2-1.dll
丢失了。如何使用CMake将所有必需的GCC运行时库包含在程序中?
答案 0 :(得分:5)
正如rubenvb正确回答:libgcc是必需的,或者你应该将CMAKE_EXE_LINKER_FLAGS=-static
添加到你的CMakeLists.txt。
作为替代方案,您可以尝试在MinGW安装中找到libgcc_s_sw2-1.dll,并使用InstallRequiredSystemLibraries将其与您的安装“打包”。这也很好地与CPack集成。
E.g。在我自己的代码中,我有:
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 )
稍后,在准备安装或包的部分:
# 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 )
答案 1 :(得分:4)
使用GCC编译的所有程序都需要libgcc dll。如果您不想在程序中重新发布此DLL,则必须通过将-static
传递给链接器或在CMake中静态链接:
CMAKE_EXE_LINKER_FLAGS=-static
这是GCC特有的。