CMake:使用多个目录配置CMake

  • 本文关键字:CMake 配置 cmake
  • 更新时间 :
  • 英文 :


背景

我正在努力学习CMake,我一直在努力学习如何通过在每个目录中拥有单独的CMakeLists.txt文件来构建我的系统。需要注意的是main.cpp#包括enemy.h。我的文件结构的简化版本看起来像这样:

mainfolder
|
|---- build
|        |---- CMake stuff
|---- enemy
|        |
|        |---- enemy.cpp
|        |---- enemy.h
|        |---- CMakeLists.txt
|
|---- fighter.h
|---- fighter.cpp
|---- main.cpp
|---- CMakeLists.txt

以下是我的CMakeLists.txt文件:

mainfolder/CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project (game) 
add_subdirectory(enemy)  
set(HEADERS
fighter.h
)
set(SOURCES
main.cpp
fighter.cpp
)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_link_libraries(${PROJECT_NAME} enemy)

主文件夹/敌人/CMakeLists.txt

add_library(enemy enemy.cpp enemy.h)
target_include_directories(enemy PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(enemy )

问题/我尝试了什么

我无法构建系统,我被疯狂地欺骗和迷失了方向。我目前的尝试是基于这篇文章,但我也尝试过简单地使用

target_include_directories(${PROJECT_NAME} PUBLIC enemy)
target_link_directories(${PROJECT_NAME} PRIVATE enemy)

target_link_libraries(${PROJECT_NAME} enemy)

mainfolder/CMakeLists.txtmainfolder/敌人/CMakeLists.txt中的add_library(enemy enemy.h enemy.cpp)中,如本视频中6:50左右所示。使用此配置,cmake ..可以工作,但我得到一个错误,即enemy.h相对于main.cpp不存在。

这个错误意味着编译器仍然找不到enemy.h。我想我可以用main.cpp#include "enemy/enemy.h,但这似乎违背了CMake的目的。关于如何正确实现这些多层CMakeLists.txt文件,有什么建议吗?

我还没有用内存打印的cmake测试过它。模板是常用的。

mainfolder/CMakeLists.txt

cmake_minimum_required(VERSION 3.22)
project (game)
add_executable(game main.cpp fighter.cpp fighter.h)
add_subdirectory(enemy) # grab the library and headers (or path to headers)
target_link_libraries(game PRIVATE enemy) # link `game` to `enemy` 

主文件夹/敌人/CMakeLists.txt

add_library(enemy STATIC)
target_sources(enemy PRIVATE enemy.cpp PUBLIC enemy.h) 
# If you library is being used somewhere else, 
# you can remove last 'PUBLIC' and uncomment next three lines
# target_include_directories(enemy PUBLIC
#  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
#  $<INSTALL_INTERFACE:include/enemy>  # <prefix>/include/enemy )
```

最新更新