Cmake基础

Cmake基础,第1张

Cmake基础 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:二进制库的名称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)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5698405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存