Cmake使用

59 阅读2分钟

常用构建工具

一、makefile

makefile脚本文件 --make命令

二、cmake

CMakeLists.txt脚本文件
cmake命令生成makefile文件,在执行make文件生成可执行文件

{3E89897F-1DC6-4CBC-9C18-D7C6D7CBA056}.png

cmake使用

linux 命令行模式

安装 sudo apt install cmake 构建 //cmake命令生成make cmake ./ //执行make make

CMakeLists详解

# 1、支持cmake的最小版本  #号单行注释  #[[....]]多行注释
#[[
支持cmake的最小版本
支持cmake的最小版本
支持cmake的最小版本
]]
cmake_minimum_required(VERSION 3.5.0)

#2、项目名称  随便指定
project(CMakeDemo)

#可随意指定变量
set(SRC_LIST div.cpp main.cpp mul.cpp sub.cpp add.cpp)
#打包的添加可执行的文件

#方案一:
#add_executable(可执行程序名 源文件名称)
#app最后生成的可执行程序的名称
#div.cpp main.cpp mul.cpp sub.cpp add.cpp 需要用到的源文件,从当前路径开始找
#add_executable(app div.cpp main.cpp mul.cpp sub.cpp add.cpp)

#方案二:
#变量定义
#SRC_LIST 资源路径
set(SRC_LIST div.cpp main.cpp mul.cpp sub.cpp add.cpp)
#执行程序的名称 资源文件变了
#add_executable(app ${SRC_LIST})

#方案三:可以不用手动一个一个添加资源文件,已目录方式
#搜所文件
#PROJECT_SOURCE_DIR : 项目源路径  该路径为cmake命令后面指定的路径 ,
#例如:cmake /jett/bin即表示PROJECT_SOURCE_DIR=/jett/bin
#将${PROJECT_SOURCE_DIR}搜索到的资源文件放入变量 SRC_LIST
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST2)

#方案四:可以不用手动一个一个添加资源文件,已目录方式
#CMAKE_CURRENT_SOURCE_DIR:这个路径表示CMakeLists.txt文件所在的路径 当前路径下
#详情查看cmakefile 获取文件相关文档
#GLOB获取目录下匹配的文件
#GLOB_RECURSE 用于递归地获取匹配指定通配符模式的文件
#SRC_LIST3 用于存储查询到的文件列表的变量
#${CMAKE_CURRENT_SOURCE_DIR}/*.cpp 查询当前路径下满足条件的文件
file(GLOB SRC_LIST3 ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)


#目录操作 比如源文件和头文件不在同一个目录  include  src
#指定头文件路径,这样main.cpp中使用到对应的文件可以直接 #include "head.h",不用写相对路径找到
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)


#设置可执行程序的输出路径  路径如果不存在,会自动创建,编译成可执行程序需要
set(HOME /jett/bin)
set(EXECUTABLE_OUTPUT_PATH ${HOME})


#指定库生成路径LIBRARY_OUTPUT_DIRECTORY
set(LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)

#生成出来的a或so文件需要发布库文件和头文件给用户使用 libcalc.so head.h
#
link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/lib )
#编译库文件
#windows 静态库 .lib 动态库 .dll
#linux 静态库 .a 动态库 .so
#准备好需要的cpp文件  src/add.cpp div sub mul
#生成动态链接库SHARED
#生成静态链接库STATIC
add_library(calc SHARED ${SRC_LIST})


#add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/)
add_subdirectory(test)

#连接动态库  一般写到最后一行 PRIVATE PUBLIC INTERFACE
//表示calc库需要链接libace_napi.z.so
target_link_libraries(calc PUBLIC libace_napi.z.so)

#CMake嵌套问题 有多个CMakeList.txt文件嵌套问题
#add_subdirectory(子CMakeList.txt文件的路径)

#自定义宏  add_definitions(-D宏名称)  一般处理日志
add_definitions(-DDEBUG)

#日志输出
message("srcPath:}"${PROJECT_SOURCE_DIR})
#list操作
#向list中添加数据
list(APPEND SRC_LIST add.cpp sub.cpp mul.cpp div.cpp main.cpp)
#移除list中固定值
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
list(REMOVE_ITEM SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)
#移除list中索引位置的数据
list(REMOVE_AT SRC_LIST 2)
#获取list的长度 把SRC_LIST3的长度存入VAR
list(LENGTH SRC_LIST3 VAR)
#获取list中索引为2的数据存入VAR
list(GET SRC_LIST 2 VAR)
#字符串的连接  比如原来是abc  连接后是 axxxbxxxcxxx
list(JOIN SRC_LIST xxx VAR)
#查找list中指定元素存入VAR  找不到返回-1
list(FIND SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp VAR)
#在list中的指定位置插入数据 在SRC_LIST中索引为2的位置存入ABC
list(INSERT SRC_LIST 2 ABC)
#在list中0号位置存入
list(PREPEND SRC_LIST ABC)
#当成栈使用 移出list最后取数据
list(POP_BACK SRC_LIST ABC)
#当成栈使用 移出list第一个取数据
list(POP_FRONT SRC_LIST ABC)
#list数据翻转
list(REVERSE SRC_LIST)
#list排序
#COMPARE  默认STRING按字母顺序  FILE_BASENAME文件名顺序 NATURAL使用自然数顺序
#CASE   默认SENSITIVE大小写敏感  INSENSITIVE大小写不敏感
#ORDER  默认ASCENDING升序  DESCENDING降序
#list(SORT SRC_LIST COMPARE)

cmake使用教程(实操版)-CSDN博客