使用cmake进行静态链接

时间:2015-05-11 22:23:46

标签: c++ cmake static-linking

我尝试静态链接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)

1 个答案:

答案 0 :(得分:1)

如果您动态链接SFML,而SFML又与libstdc ++动态链接,那么由于SFML,您的应用程序仍然需要libstdc ++的so / dll文件。

将SFML.dll视为单独的可执行文件。该可执行文件对libstdc ++具有动态运行时依赖性。你无法摆脱这种情况,因为SFML已经被链接了,并且没有办法让它指向与你的可执行文件静态链接的libstdc ++部分。

摆脱依赖关系的唯一方法是确保所有组件在链接阶段静态链接到库。

这里需要注意的重要一点是,静态库对此无关紧要。静态库永远不会通过链接器(将它们视为一堆打包在一起的目标文件),因此它是顶级可执行文件或动态库,用于确定它们如何链接到标准库。

因此,如果您要将SFML构建为静态库,而不是由可执行文件(可配置为静态链接libstdc ++)引入,则问题也会消失。