【问题标题】:CMake - Module + Library confusionCMake - 模块 + 库混淆
【发布时间】:2018-10-19 11:04:21
【问题描述】:

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

我应该创建一个由以下组成的新项目:

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

    李>
  2. Module(未来可能超过 1 个):它包含一些特定于模块的类(例如,分类器、估计器等)和一个 main。

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

|-- 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 文件夹中的源文件。

我有两个问题:

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

其次,如果我想链接外部库(例如,OpenCV 或 dlib),我应该将它单独链接到模块和库中,还是应该将它链接到根目录CMakeLists.txt 文件(前提是该库无处不在)?

我真的需要一些帮助来尝试理解 CMAKE。有人可以解释或请指导我找到有关此主题的合适教程。


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

根/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Project_Name)

add_subdirectory(Library)
add_subdirectory(Application)

库/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})

应用程序/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)

现在一切似乎都很顺利!再次感谢您,再次抱歉让您感到困惑!

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

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

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

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

    【讨论】:

    • 马修,谢谢你回答我。我通过更新问题来回复你。再次非常感谢您的帮助。
    • CMAKE_APPLICATION_DIR_DIR 的值是多少?它不是标准变量。通常是CMAKE_CURRENT_SOURCE_DIR
    • 谢谢!最后,我成功添加了添加到问题中的 CMakeLists.txt 文件!
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 2012-12-09
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多