【发布时间】:2018-10-19 11:04:21
【问题描述】:
我已经开始了一个新的 c++ 项目,但我对所有 CMake 功能感到困惑。我试图通过查看示例和 CMake 教程来更好地理解
我应该创建一个由以下组成的新项目:
-
库:它包含一些将由以下模块使用的通用类(例如,向量、矩阵、图像等)
李> -
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/src 和 Module/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)
现在一切似乎都很顺利!再次感谢您,再次抱歉让您感到困惑!
【问题讨论】: