CMake构建库和可执行文件一次并将其链接

CMake building library and executable once and linking it

本文关键字:一次 链接 构建 可执行文件 CMake      更新时间:2024-09-27

我正试图同时使用cmake构建两个项目。我的文件夹结构如下:


project
├── CMakeLists.txt
├── build
├── out
├── lib
├── yanthra_engine
│   ├── CMakeLists.txt
│   └── ...
└───sandbox
├── CMakeLists.txt
└── ...

main CmakeLists.txt

cmake_minimum_required(VERSION 3.4.1)
project(yanthra_console VERSION 0.1 DESCRIPTION "A 3d Game Engine.")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fexceptions")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING "Build type selections" FORCE)
add_subdirectory(yanthra_engine)
add_subdirectory(sandbox)

yanthra_engine/CMakeLists.txt


set(THIRD_PARTY_DIR "../../../third-party")
set(MAIN_SOURCE_DIR "../../main/src")
include_directories(${THIRD_PARTY_DIR}/SDL/include)

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib )
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib)

file(GLOB_RECURSE CPP_HEADERS ${MAIN_SOURCE_DIR}/*.hpp)
file(GLOB_RECURSE CPP_SOURCES ${MAIN_SOURCE_DIR}/*.cpp)

add_library(
yanthra
SHARED
${CPP_HEADERS}
${CPP_SOURCES}
)

set (CMAKE_SHARED_LINKER_FLAGS "-F../yanthra_engine/Frameworks -framework SDL2 -framework OpenGL")

沙箱/CMakeLists.txt


set(THIRD_PARTY_DIR "../../main")
set(MAIN_SOURCE_DIR "./src")
include_directories(${THIRD_PARTY_DIR}/include)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../out)
file(GLOB_RECURSE CPP_HEADERS ${MAIN_SOURCE_DIR}/includes/*.h)
file(GLOB_RECURSE CPP_SOURCES ${MAIN_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE LIB ${MAIN_SOURCE_DIR}/../lib/*.dylib)
add_executable(
yanthra_sandbox
${CPP_HEADERS}
${CPP_SOURCES}
)
set_target_properties(
yanthra_sandbox
PROPERTIES
LINK_FLAGS
"-F../yanthra_engine/Frameworks -framework SDL2 -framework OpenGL"
)
target_link_libraries(yanthra_sandbox PRIVATE ${LIB})

我想知道我是否在每个构建模式下生成库文件,考虑到每个模式都将其输出构建到自己的文件夹,即库的lib/Debug(用于调试模式(和可执行文件的out/Debug,我将如何将其与相应的可执行文件链接。

您似乎没有将链接链接到yanthra目标。不过,您应该这样做,因为这将自动选择使用当前配置编译的库。

沙盒/CMakeLists.txt

...
target_link_libraries(yanthra_sandbox PRIVATE yanthra ${LIB})
...

至于导入其他库:最好使用find_library。这将自动设置链接选项,并使为yanthra_sandbox添加这些选项成为不必要。

yanthra_engine/CMakeLists.txt

...
list(APPEND CMAKE_FRAMEWORK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Frameworks")
find_library(SDL2_LIB SDL2 REQUIRED)
find_library(OPEN_GL_LIB OpenGL REQUIRED)
target_link_library(yanthra PUBLIC "${SDL2_LIB}" "${OPEN_GL_LIB}")

这应该允许您从两个目标中删除编译器标志。如果lib目录中没有依赖项,您也可以删除对文件系统/上库的搜索