CMakeLists.txt
指出源码文件、依赖库所在路径;采用的编译器g++/gcc版本;release还是debug模式编译;是否支持c++11;生成的可执行文件/库文件路径和名称、版本号;指定安装路径。
基本语法
- 指令是大小写无关的,参数和变量是大小写相关的。但推荐全部使用大写指令。
- 变量使用
方
式
取
值
,
但
是
在
I
F
控
制
语
句
中
是
直
接
使
用
变
量
名
。
如
:
{}方式取值,但是在 IF 控制语句中是直接使用变量名。 如:
方式取值,但是在IF控制语句中是直接使用变量名。如:{SRC_LIST}
- 指令(参数 1 参数 2…) 参数使用括弧括起,参数之间使用空格或分号分开。
如:ADD_EXECUTABLE(hello main.c func.c) 或者 ADD_EXECUTABLE(hello main.c;func.c) - 注释:
# comment
一些常量
${PROJECT_SOURCE_DIR} #表示根目录
${CMAKE_CURRENT_SOURCE_DIR} #CMakeLists.txt所在目录
${CMAKE_CURRENT_LIST_FILE} #CMakeLists.txt完整路径
${CMAKE_CURRENT_LIST_LINE} #CMakeLists.txt当前行
${CMAKE_SOURCE_DIR} #CMake根目录
CMake常量详解
固定部分
#1.版本要求
cmake_minimum_required(VERSION 3.0.2)
#2.项目名
project(directory_test VERSION 1.0)
#3.编译方式
# CMake中有一个变量CMAKE_BUILD_TYPE,可以取值枚举入下:
# Debug|Release|RelWithDebInfo|MinSizeRel
set(CMAKE_BUILD_TYPE "Debug")
#4.指定编译器
set(CMAKE_C_COMPILER "/usr/local/gcc")
set(CMAKE_CXX_COMPILER "/usr/local/g++")
#5.添加对c++11的支持
add_compile_options(-std=c++11)
#OR set(CMAKE_CXX_FLAGS "-std=c++11")
#6.指定生成的可执行文件路径
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#7.指定生成的库路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#8.指定安装路径
install(TARGETS MathFunctions DESTINATION path/lib)#头文件
install(FILES MathFunctions.h DESTINATION path/include)#库
指定头文件搜索路径
#指定源码文件的头文件和库文件的头文件的搜索路径,相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量
include_directories(./include/srcHeadPath)
指定源码文件
# 把所有.cpp源码文件赋值给SOURCES
set(SOURCES src/a.cpp src/b.cpp)
# 把src目录下的所有.cpp文件赋值给SOURCES
aux_source_directory(${PROJECT_SOURCE_DIR}/src SOURCES)
指定依赖库
#指定链接目录,相当于环境变量中增加LD_LIBRARY_PATH的路径
link_directories(directory1 directory2 ...)
#指定上述链接目录下需要链接的库
link_libraries(main A.so ...)
##或者target_link_libraries(myProject eng mx)
#equals to below
###target_link_libraries(myProject -leng -lmx)
###target_link_libraries(myProject libeng.so libmx.so)
生成二进制文件
#在上个步骤中把所有源码文件通过set赋值给SOURCES变量
#可执行程序
add_executable(binaryFile ${SOURCES})
#库文件:有SHARED|STATIC两种库,指定库的类型
add_library(testStudent SHARED ${SOURCES})
link_libraries VS target_link_libraries
target_link_libraries 放在add_executable 后;link_libraries 放在add_executable 之前。
target_link_libraries(main A.so B.a C.so)
target_link_libraries 里库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面。在上面的命令中,libA.so可能依赖于libB.a和libC.so,如果顺序有错,链接时会报错。
find_package
find_package 是去 CMAKE_MODULE_PATH 中查找 Findxxx.cmake文件,然后在这个文件提供的路径下去寻找相应的库。find_package 指令可以得到库文件的绝对路径。find_package(libName REQUIRED) ,如果找到spdlog 库就得到下列值:
libName_INCLUDE_DIRS :libName头文件所在文件夹libName_LIBRARY_DIRS :二进制库所在文件夹libName_LIBS :二进制库的名称libNamelibName_FOUND =true。
# find required opencv
find_package(OpenCV REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})
# name of executable file and path of source file
add_executable(opencv_test src/opencv_test.cpp)
# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})
# opencv libraries
target_link_libraries(opencv_test ${OpenCV_LIBS})
显示相关
# 输出打印构建目录
MESSAGE(STATUS "This is HELLO_BINARY_DIR " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is CMAKE_SOURCE_DIR " ${CMAKE_SOURCE_DIR})
多级CMakeLists.txt文件
#先执行某个子目录下的CMakeLists.txt文件
add_subdirectory()
子目录下的cmakefile.txt文件只需要指明该目录内的源码路径、头文件路径即可
赋值
SET(QT_DONT_USE_QTGUI TRUE)
|