2015-05-11 184 views
-1

我試圖靜態鏈接libstdC++ - 6和libgcc_s_seh-1。我使用使用cmake的Clion。我正在使用SFML,但沒有必要動態鏈接。靜態鏈接使用cmake

感謝

cmake_minimum_required(VERSION 2.8.4) 
project(Game_Project) 
set(EXECUTABLE_NAME "Game_Project") 

# Enable debug symbols by default 
if(CMAKE_BUILD_TYPE STREQUAL "") 
    set(CMAKE_BUILD_TYPE Debug) 
else() 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") 
endif() 
# (you can also set it on the command line: -D CMAKE_BUILD_TYPE=Release) 


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -s") 

set(BUILD_SHARED_LIBS OFF) 
set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++") 

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/SFML-2.2/cmake/Modules/" ${CMAKE_MODULE_PATH}) 

set(CMAKE_SOURCE_DIR src) 
file(GLOB_RECURSE SRCS src/*.cpp) 

#Find any version 2.X of SFML 
#See the FindSFML.cmake file for additional details and instructions 
set(SFML_ROOT "SFML-2.2") 
find_package(SFML 2 REQUIRED system window graphics network audio) 

include_directories(${CMAKE_SOURCE_DIR} include) 

add_executable(${EXECUTABLE_NAME} ${SRCS}) 

if(SFML_FOUND) 
    include_directories(${SFML_INCLUDE_DIR}) 
    target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES}) 
    target_link_libraries(${EXECUTABLE_NAME} ${SFML_DEPENDENCIES}) 
endif() 

install(TARGETS ${EXECUTABLE_NAME} DESTINATION bin) 
+0

什麼是您的實際問題/問題/錯誤? 「它沒有必要動態鏈接。」這是否意味着它可以靜態鏈接**或**動態?如果是的話,爲什麼試圖靜態鏈接呢? –

+0

我希望gcc的lib是靜態鏈接的,對於SFML它們可以是動態的。 – Nitixx

+0

再次,你遇到了什麼問題?任何錯誤消息?什麼不符合你的期望? –

回答

1

如果您動態鏈接針對SFML,這在動態對抗的libstdC++繼而連,你的應用程序仍然需要爲libstdc這麼/ dll文件++,因爲SFML的。

將SFML.dll視爲單獨的可執行文件。該可執行文件對libstdC++具有動態運行時依賴關係。你不能擺脫這種情況,因爲SFML已經被鏈接,並且沒有辦法讓它指向靜態鏈接到你的可執行文件的libstdC++部分。

擺脫依賴關係的唯一方法是確保所有組件鏈接靜態鏈接庫中的鏈接階段。

這裏需要注意的重要一點是靜態庫對此無關緊要。靜態庫永遠不會通過鏈接器(將它們視爲一堆打包在一起的對象文件),因此它是頂級可執行文件或動態庫,它們決定了它們如何鏈接到標準庫。

因此,如果您要將SFML構建爲靜態庫,而不是由您的可執行文件引入,該文件被配置爲靜態鏈接到libstdC++,則問題也會消失。