背景
我正在努力学习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.txt和mainfolder/敌人/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 )
```