基本语法指出源码文件、依赖库所在路径;采用的编译器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)
find_packagetarget_link_libraries里库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面。在上面的命令中,libA.so可能依赖于libB.a和libC.so,如果顺序有错,链接时会报错。
find_package 是去 CMAKE_MODULE_PATH 中查找 Findxxx.cmake文件,然后在这个文件提供的路径下去寻找相应的库。find_package指令可以得到库文件的绝对路径。find_package(libName REQUIRED),如果找到spdlog库就得到下列值:
- libName_INCLUDE_DIRS:libName头文件所在文件夹
- libName_LIBRARY_DIRS:二进制库所在文件夹
- libName_LIBS:二进制库的名称libName
- libName_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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)