我尝试静态链接libstdc ++ - 6和libgcc_s_seh-1.我正在使用使用cmake的Clion。我正在使用SFML,但它没有必要动态链接。
由于
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 :(得分:1)
如果您动态链接SFML,而SFML又与libstdc ++动态链接,那么由于SFML,您的应用程序仍然需要libstdc ++的so / dll文件。
将SFML.dll视为单独的可执行文件。该可执行文件对libstdc ++具有动态运行时依赖性。你无法摆脱这种情况,因为SFML已经被链接了,并且没有办法让它指向与你的可执行文件静态链接的libstdc ++部分。
摆脱依赖关系的唯一方法是确保所有组件在链接阶段静态链接到库。
这里需要注意的重要一点是,静态库对此无关紧要。静态库永远不会通过链接器(将它们视为一堆打包在一起的目标文件),因此它是顶级可执行文件或动态库,用于确定它们如何链接到标准库。
因此,如果您要将SFML构建为静态库,而不是由可执行文件(可配置为静态链接libstdc ++)引入,则问题也会消失。