使用包含和源路径进行CMake - 基本设置

bit*_*gor 41 c++ cmake

我正在尝试设置一个看起来像我自己的项目的测试项目,只是为了让事情先行,它看起来像这样:

/MainProject/inc/main.h
/MainProject/src/main.cpp
/LibProject/inc/test.h
/LibProject/src/test.cpp
Run Code Online (Sandbox Code Playgroud)

我找到了一些教程,但是当我有inc和src文件夹时,我无法找到如何设置它?CMakeLists.txt文件看起来如何?我会在每个项目文件夹中有一个/,一个吗?好像我不需要在inc和src文件夹中有一个?

Goo*_*ide 83

CMakeLists.txt每个源子目录都需要一个.您的结构应如下所示:

root
|-MainProject
| |-inc
| | '-main.h
| |-src
| | |-main.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt 
|-LibProject
| |-inc
| | '-test.h
| |-src
| | |-test.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt
'-CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

内容root/CMakeLists.txt:

project(MyProject)
add_subdirectory(MainProject)
add_subdirectory(LibProject)
Run Code Online (Sandbox Code Playgroud)

内容LibProject/CMakeLists.txtMainProject/CMakeLists.txt:

add_subdirectory(src)
Run Code Online (Sandbox Code Playgroud)

内容LibProject/src/CMakeLists.txt:

# Notice name prefix of this variable, set by CMake according
# to value given with "project()" in the root CMakeLists.txt.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
add_library(LibProject test.cpp)
Run Code Online (Sandbox Code Playgroud)

内容MainProject/src/CMakeLists.txt:

include_directories(${MyProject_SOURCE_DIR}/MainProject/inc)
# I assume you want to use LibProject as a library in MainProject.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
link_directories(${MyProject_SOURCE_DIR}/LibProject/src)
add_executable(MainProject main.cpp)
target_link_libraries(MainProject LibProject)
Run Code Online (Sandbox Code Playgroud)

然后配置和构建:

$ cd root
$ mkdir build
$ cd build
$ cmake ..
$ make
Run Code Online (Sandbox Code Playgroud)

  • 关键不是要复制你的答案,而是要完成它.据我所知,如果没有两个缺少的`CMakeLists.txt`和缺少的`link_directories()`命令,它将无法工作.我原本打算评论你的答案,但我的声誉太低了,不能这样做.所以我认为发布第二个答案将是最自包含的方式.不是故意冒犯你. (10认同)
  • `subdirs`已弃用. (4认同)

Beg*_*ner 20

你可以这样做.

  • 请问为什么你有'$ {PROJECT_SRC_DIR}`?我遇到了一个CMake错误并且必须按如下方式更正变量:`$ {PROJECT_SOURCE_DIR}`以使其工作 (4认同)
  • 根据文档,它应该是PROJECT_SOURCE_DIR.您可以在此处找到详细信息:https://cmake.org/Wiki/CMake_Useful_Variables (3认同)

Agu*_*ina 6

就我而言,我想用一个CMakeList做到这一点。它为我工作。我添加我的解决方案,以防任何人使用。

这是我的情况:

My structure:
Project
|CMakeLists.txt
|-src
| |*.cpp
| |*.c
|-include
| |*.hpp
| |*.h
Run Code Online (Sandbox Code Playgroud)

我的CMakeLists.txt必须包含以下主要部分:

include_directories(
        ${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/src
)
Run Code Online (Sandbox Code Playgroud)

^使.cpp文件能够在包含文件夹中添加头。

file(GLOB all_SRCS
        "${PROJECT_SOURCE_DIR}/include/*.h"
        "${PROJECT_SOURCE_DIR}/include/*.hpp"
        "${PROJECT_SOURCE_DIR}/src/*.cpp"
        "${PROJECT_SOURCE_DIR}/src/*.c"
        )
Run Code Online (Sandbox Code Playgroud)

^只需添加这些文件夹中的内容即可。

PS:如果要查看完整的CMakeLists.txt,请转到项目链接NEGU93 / ForbiddenDesert

  • 是的,这将生成一个Makefile,如果头文件发生更改,该文件将正确地重新编译相应的文件。我不确定先前的建议是否会这样做(或者至少没有明确显示) (2认同)