CMake-模块+库混乱

时间:2018-10-19 11:04:22

标签: c++ cmake

我已经开始了一个新的c ++项目,而我对所有CMake功能感到困惑。通过查看示例和CMake教程,我试图更好地理解

我应该创建一个新项目,该项目包括:

  1. :它包含一些通用类,这些类将由以下模块使用(例如,矢量,矩阵,图像等)。

  2. 模块(将来可能会超过1):它包含一些特定于模块的类(例如,分类器,估计器等)和一个主模块。

    < / li>

我建议的文件夹结构如下:

|-- Root Project
    |-- CMakeLists.txt
    |
    |-- Library
    |   |-- CMakeLists.txt
    |   |-- include
    |   |   |-- CMakeLists.txt (?)
    |   |   `-- Lib_Class.h
    |   `-- src
    |       |-- CMakeLists.txt (?)
    |       `-- Lib_Class.h
    |
    |-- Application 1
    |   |-- CMakeLists.txt
    |   |-- include
    |   |   |-- CMakeLists.txt (?)
    |   |   `-- Method.h
    |   `-- src
    |       |-- CMakeLists.txt (?)
    |       |-- Method.cpp
    |       `-- main.cpp
    |
    |-- Application 2
    |   |-- CMakeLists.txt
    |   |
    `

当我必须将代码实际添加到不同的 CMakeLists.txt 文件时,就会出现问题。根据我的推理,我会:

  • Root / CMakeLists.txt :用于创建项目并添加库和模块的子目录。
  • Library / CMakeLists.txt :这将创建包含标题(来自 include 文件夹)和源文件(来自 src 文件夹)的库。 。
  • Module / CMakeLists.txt :这将使用库和特定于模块的类以及中的头文件从 src / main.cpp 文件中创建可执行文件。 > include 文件夹和 src 文件夹中的源文件。

我有2个问题:

首先,我还通过 Library / src Module / src 文件夹中的 CMakeLists.txt 文件找到了其他答复中的解决方案。但是我真的不明白如何使用它们以及在其中写什么,因为我只会在父文件夹中使用 CMakeLists.txt 文件。

第二,如果要链接外部库(例如,OpenCV或dlib),应分别将其链接到模块和库中,还是应将其链接到根目录 CMakeLists.txt 中>文件(前提是到处都使用该库)?

我真的需要一些帮助来尝试了解CMAKE。有人可以解释还是请引导我进入有关此主题的合适教程。


Matthieu,非常感谢您的帮助。根据您提供给我的解释,我得出了以下CMakeLists.txt文件:

Root / CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Project_Name)

add_subdirectory(Library)
add_subdirectory(Application)

Library / CMakeLists.txt

project(Library)

set(LIB_HEADERS 
    include/Lib_Class.h
)

set(LIB_SOURCES 
    src/Lib_Class.cpp
)

add_library(Library_Name SHARED ${LIB_SOURCES} ${LIB_HEADERS})

Application / CMakeLists.txt

project(Application)

set(APP_HEADERS 
    include/Method.h
)

set(APP_SOURCES 
    src/Method.cpp 
    src/main.cpp
)

add_executable(Application_Name ${APP_SOURCES} ${APP_HEADERS})
target_link_libraries(Application_Name Library_Name)

现在一切似乎都正常了!再次感谢您,再次对您感到困惑!

1 个答案:

答案 0 :(得分:1)

root cmakelists应该设置所有变量,检查编译器支持和库是否存在。

然后转到每个子文件夹,并根据源代码和检测到的库创建库和可执行文件。您还应该在那里设置所有链接的库。

然后,cmake将弄清楚什么取决于什么。