2012-10-21 78 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。