【问题标题】:CMake building library and executable once and linking itCMake构建库和可执行文件一次并链接它
【发布时间】:2020-11-14 08:30:37
【问题描述】:

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



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

  

主 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/调试(用于调试模式)和可执行的输出/调试。

【问题讨论】:

  • 顺便说一句,除了yanthra(可能还有它的依赖项)之外,您还需要链接其他库吗?
  • @fabian 是的,我还想链接其他库,如 SDL 和 OpenGL 等。感谢您的回复。

标签: c++ cmake c++17


【解决方案1】:

您似乎没有将链接链接到 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 目录中没有依赖项,您还可以删除对文件系统上的库的搜索/

【讨论】:

  • 感谢您的精彩回答。我还有另一个疑问是应该安装库还是应该链接它。只需链接即可。这是期望的行为吗?
  • 这完全取决于你想对程序/库做什么。如果在不安装 lib 的情况下满足所有要求,则似乎没有必要安装 lib。如果您想发布该库,您可能需要在已安装版本中测试该库并检查所有文件是否都位于正确的位置。我对 macOS 不够熟悉,无法了解安装 lib(未)的所有后果。
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多