CMAKE:配置有多个目录的Cmake

发布于 2025-02-08 19:27:44 字数 1750 浏览 2 评论 0原文

背景

我正在尝试学习Cmake,并且我一直在尝试通过在每个目录中使用单个cmakelists.txt文件来学习如何构建系统。一个值得注意的是main.cpp #includes 敌人。我的文件结构的简化版本看起来像这样的结构:

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)

mainfolder/noye/eyne/cmakelists.txt

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

target_link_libraries(enemy )

< Strong>问题/我尝试的

我无法构建系统,我疯狂地迷失了。我目前所示的尝试是基于此但是我也尝试简单地

target_include_directories(${PROJECT_NAME} PUBLIC enemy)

target_link_directories(${PROJECT_NAME} PRIVATE enemy)


target_link_libraries(${PROJECT_NAME} enemy)

ainfolder/cmakelists.txt and and add_library(敌人.txt ,如在6:50左右所示,此视频。使用此配置,cmake ..有效,但是我遇到了一个错误,YENER.H与main.cpp不存在。

这个错误对我来说意味着编译器仍然找不到敌人。我想我只能写#include“敌人/敌人。正确实现这些多层cmakelists.txt文件?

Background

I'm trying to learn CMake, and I've been trying to learn how to build my system by having individual CMakeLists.txt files in each directory. One note is that main.cpp #includes enemy.h. A simplified version of my file structure looks like this structure looks like this:

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

Here are my CMakeLists.txt files:

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)

mainfolder/enemy/CMakeLists.txt

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

target_link_libraries(enemy )

Problem/What I've Tried

I can't the system to build, and I am wildly bamboozled and lost. My current attempt as shown is based on this this post, but I've also tried to simply have

target_include_directories(${PROJECT_NAME} PUBLIC enemy)

target_link_directories(${PROJECT_NAME} PRIVATE enemy)


target_link_libraries(${PROJECT_NAME} enemy)

In mainfolder/CMakeLists.txt and and add_library(enemy enemy.h enemy.cpp) in mainfolder/enemy/CMakeLists.txt and as shown at around 6:50 in this video. With this configuration, cmake .. works, but I get an error that enemy.h doesn't exist in relation to main.cpp.

That error implies to me that the compiler still can't find enemy.h. I suppose I could just write #include "enemy/enemy.h in main.cpp, but that seems like it would defeat the purpose of CMake. Any suggestions on how to implement these multi-layered CMakeLists.txt files correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

优雅的叶子 2025-02-15 19:27:44

我尚未使用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` 

mainfolder/敌人/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
#  
lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
#  
lt;INSTALL_INTERFACE:include/enemy>  # <prefix>/include/enemy )
```

I haven't tested it with cmake, printed from memory. The template is commonly used.

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` 

mainfolder/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
#  
lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
#  
lt;INSTALL_INTERFACE:include/enemy>  # <prefix>/include/enemy )
```
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文