我已经开始了一个新的c ++项目,而我对所有CMake功能感到困惑。通过查看示例和CMake教程,我试图更好地理解
我应该创建一个新项目,该项目包括:
库:它包含一些通用类,这些类将由以下模块使用(例如,矢量,矩阵,图像等)。
模块(将来可能会超过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 文件时,就会出现问题。根据我的推理,我会:
我有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)
现在一切似乎都正常了!再次感谢您,再次对您感到困惑!
答案 0 :(得分:1)
root cmakelists应该设置所有变量,检查编译器支持和库是否存在。
然后转到每个子文件夹,并根据源代码和检测到的库创建库和可执行文件。您还应该在那里设置所有链接的库。
然后,cmake将弄清楚什么取决于什么。