CMakeList.txt编写指南
最近遇到一个没有给CMakeList.txt的项目,因编译需求,决定自行编写CMakeList.txt(新手一枚,先学习后编写再编译)。
1. 确定cmake最低版本需求
cmake_minimum_required(VERSION 3.0.0)
cmake的最低版本为3.0.0
2. 确定工程名
project(FaceDetector VERSION 0.1.0)
工程名为FaceDetector,版本为0.1.0
3. 设置变量值
set(BUILD_DIR "${PROJECT_SOURCE_DIR}/build") #BUILD_DIR不是预定义变量
set(CMAKE_CXX_STANDARD 17) #CMAKE_CXX_STADNARD为预定义变量
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/share/OpenCV") #在原有的基础上增加路径
set操作可以看为变量赋值操作,格式为:
set(var dir1 [dir2])
4. 添加编译信息
add_definitions(-w)
用于添加编译器定义选项的命令
5.添加需要的库
find_package(gmp 1.7 REQUIRED)
搜索名为gmp的1.7版本的库,并作为项目依赖项(由REQUIRED指定
6. 添加需要的头文件
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(/usr/local/cuda-8.0/include/)
两种添加头文件的方法但都是include_directories(DIR_PATH)
include_directories() 是一个全局函数,会将指定的目录应用于整个项目中的所有目标,而 target_include_directories() 是一个针对特定目标的函数,可以为每个目标单独指定包含目录。
7. 设置源码
set(SRC
${PROJECT_SOURCE_DIR}/src/detector.cpp
${PROJECT_SOURCE_DIR}/src/demo.cpp
${PROJECT_SOURCE_DIR}/test.cpp
)
8. 添加并编译动态库
link_directories(${PROJECT_SOURCE_DIR}) #指定链接器在构建过程中查找库文件的路径
target_link_libraries(plate_recognition -llianghao -lpthread -lm -lstdc++) # 将其他的库链接到 “plate_recognition” 库中。这里列出了要链接的库的名称,包括 “lianghao”、“pthread”、“m” 和 “stdc++”
9. 指定生成目标
add_executable(Test main.cpp) # 源为main.cpp 目标为Test
add_executable(Test main.cpp)
注意:这里只需要添加自己写的源文件
10.总结
- target_link_libraries是动态链接,当然要放到add_executable之后了
- 可以用include_directories添加自己写的头文件
- add_executable时,需要将自己的所有源文件都放进去,但必须包含main.c(cpp)
- 可以使用:
file(GLOB_RECURSE ALL_CPP "facedetector/*.cpp" "boosting/*.cpp")
获取所有源文件!