2012-10-21 59 views
3

我已经编译了一个C++程序,它完全可以在我的电脑上运行,但是如果我的朋友试图启动程序,它说缺少libgcc_s_sw2-1.dll。我如何在使用CMake的程序中包含所有需要的GCC运行时库?如何使用CMake安装GCC运行时库?

回答

3

由于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

注意的MinGW-W64没有'mingwm10.dll',和他们通常会提供'libgcc_s_sjlj-1.dll',而x64的GCC 4.8默认会有'libgcc_s_seh-0.dll'。 libgcc的自动打包依赖于构建系统。 – rubenvb

+1

@rubenvb。诚然,我认为你的解决方案是更好的解决方案。但在那些用户确实希望将libgcc作为dll构建的情况下,至少在CMake中可以收集所有这些与系统相关的文件。在我自己的项目中,我甚至为MinGW,VS2008和VS2010编写了一个小脚本。 –

3

所有使用GCC编译的程序都需要libgcc dll。如果你不想重新发布与程序这个DLL,你必须通过-static到链接静态链接,或CMake的:

CMAKE_EXE_LINKER_FLAGS=-static 

这是具体的GCC。