CMakeLists.txt的语法介绍和几个实例
参考
https://blog.csdn.net/afei__/article/details/81201039
https://www.bilibili.com/video/BV12f4y1X7Jm?t=505
简介
cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。
语法介绍
CMAKE_SOURCE_DIR和PROJECT_SOURCE_DIR,指的是定义顶级CMakeLists.txt的绝对路径
命令名称是不区分大小写的,而参数和变量是大小写相关的。
1、指定cmake的最小版本
cmake_minimum_required(VERSION 3.5)
声明要求的cmake最低版本,这个命令是可选的
可以在linux下输入cmake -version可以查看cmake的版本
2、项目名称
project(demo)
声明cmake工程的名称demo
这个命令不是强制性的,但最好都加上。它会引入两个变量 demo_BINARY_DIR 和 demo_SOURCE_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。
3、编译模式
set(CMAKE_BUILD_TYPE "Debug")
设置cmake编译模式有debug和release两种,因为debug模式编译生成的可执行文件包含可调试的相关信息,所以文件大小会变大。
4、编译优化
set(CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3")
参数CMAKE_CXX_FLAGS含义是:set compiler for c++ language
添加C++11标准支持
-march=native 指定目标程序的cpu架构来进行程序优化
native 就是相当于自检测cpu,-march是gcc优化选项
后面的-O3使用来调节编译是的优化程度,最高为-O3,最低为-O0即不做优化
5、指定头文件和库文件
5.1 头文件
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
把该目录设为头文件目录
5.2 库文件
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
把该目录设为链接目录,它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。也可以多个链接库文件地址
LINK_DIRECTORIES(directory1 directory2 ...)
一般链接库目录的做法,如下:
LINK_DIRECTORIES(/home/cxzx/opencv44/lib)
LINK_LIBRARIES(opencv_ml opencv_objdetect opencv_imgproc opencv_core opencv_highguiopencv_imgcodecs opencv_shape opencv_videoio opencv_video)LINK_DIRECTORIES(/home/cxzx/training/cv_yolo)
LINK_LIBRARIES(darknet)
6、指定编译包含的源文件
6.1 明确指定包含哪些源文件
add_executable(demo demo.cpp test.cpp util.cpp)
6.2 搜索所有的 cpp 文件
aux_source_directory(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量中。
aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件
add_library(demo ${SRC_LIST})
6.3 自定义搜索规则
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(demo ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
7、设置编译类型
add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库
add_library 默认生成是静态库,通过以上命令生成文件名字,
- 在 Linux 下是:
demo
libcommon.a
libcommon.so - 在 Windows 下是:
demo.exe
common.lib
common.dl
8、设置 target 需要链接的库
target_link_libraries( # 目标库demo# 目标库需要链接的库
在 Windows 下,系统会根据链接库目录,搜索xxx.lib 文件,Linux 下会搜索 xxx.so 或者 xxx.a 文件,如果都存在会优先链接动态库(so 后缀)。
8.1 指定链接动态库或静态库
target_link_libraries(demo libface.a) # 链接libface.a
target_link_libraries(demo libface.so) # 链接libface.so
8.2 指定全路径
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a)
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.so)
8.3 指定链接多个库
target_link_libraries(demo${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.aboost_system.aboost_threadpthread)
9. 设置变量
9.1 set 直接设置变量的值
set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})
9.2 set 追加设置变量的值
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})
10、打印信息message
message(${PROJECT_SOURCE_DIR})
message("build with debug mode")
message(WARNING "this is warnning message")
message(FATAL_ERROR "this build has many error") # FATAL_ERROR 会导致编译失败
11、find_package
find_package( OpenCV REQUIRED)
添加依赖,去寻找该库的头文件位置、库文件位置以及库文件名称,并将其设为变量,返回提供给CMakeLists.txt其他部分使用。
在CMakeLists中使用第三方库的三部曲
find_package、include_directories、target_link_libraries
include_directories(${OpenCV_INCLUDE_DIRS})
去哪里找头文件
target_link_libraries(${OpenCV_LIBRARIES})
需要链接的库文件
LINK_DIRECTORIES()
去哪里找库文件(.so/.lib/.ddl等)
12、安装地址配置
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
设定生成的可执行二进制文件存放的存放目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
设定生成的库文件的存放目录
SET(CMAKE_INSTALL_PREFIX < install_path >)
在CMakeLists中指定安装位置
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
在编译终端指定安装位置
实例
1、demo1
└── demo1├── build├── CMakeLists.txt└── demo.cpp
新建demo.cpp
#include <iostream>int main()
{std::cout<< "hello world" << std::endl;
}
新建CMakeLists.txt
add_executable(demo demo.cpp)
运行
mkdir build && cd build &&cmake ..&& make -j
./demo
为什么要新建一个 build 文件夹?
一般我们采用 cmake 的 out-of-source 方式来构建(即生成的中间产物和源代码分离),这样做可以让生成的文件和源文件不会弄混,且目录结构看起来也会清晰明了。所以推荐使用这种方式,至于这个文件夹的命名并无限制,我们习惯命名为 build
2、demo2
demo2
├── build
├── CMakeLists.txt
├── main.cpp
└── src├── add.cpp└── add.hpp
新建main.cpp
#include <iostream>
#include "add.hpp"int main()
{std::cout << "hello world" << std::endl;int a = 1, b = 1;std::cout << Add(a,b) << std::endl;return 0;
}
新建add.cpp
#include <iostream>int Add(int a, int b)
{return a+b;
}
新建add.hpp
#ifndef __ADD_HPP__
#define __ADD_HPP__int Add(int a, int b);#endif
新建CMakeLists.txt
cmake_minimum_required(VERSION 3.5)project(demo2)
include_directories(./src)add_executable(demo main.cpp ./src/add.cpp)
或者使用
cmake_minimum_required(VERSION 3.5)project(demo2)
include_directories(./src)FILE(GLOB_RECURSE SRCS ${CMAKE_SOURCE_DIR}/src/*.cpp)
add_executable(demo main.cpp ${SRCS})
运行
mkdir build && cd build &&cmake ..&& make -j
./demo
结果
hello world
2
CMakeLists.txt的语法介绍和几个实例相关推荐
- ROS知识: vanilla(香草) CMakeLists.txt 的语法
(catkin/CMakeLists.txt - ROS Wiki) 前言 首先,对于学习ROS,CMakeLists.txt 的语法非常重要:如果不懂将无法开发!而要想明白 vanilla(香草) ...
- cmake 编译文件 CMakeLists.txt 语法介绍与实例演练
一.Cmake 简介 cmake 是一个跨平台.开源的构建系统.它是一个集软件构建.测试.打包于一身的软件.它使用与平台和编译器独立的配置文件来对软件编译过程进行控制. 二.常用命令 1. 指定 cm ...
- Android-JNI开发系列《八》CMakeLists.txt语法使用
人间观察 带饭去上班的都是成年人的奢侈品! 技术永远在不断的更新升级,Android也一样. 目前在Android中的JNI开发都是采用的CMake进行编译c,c++代码来构建项目,早期都是Andro ...
- 【转载】CMake 语法 - 详解 CMakeLists.txt
作者:红橙Darren 链接:https://www.jianshu.com/p/528eeb266f83 来源:简书 目录 1. 初试 cmake 的 helloworld 2. 构建生成 .so ...
- 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法
在不同的平台编译的时候,会用到一些系统内置的变量,比如操作系统名称,版本号之类: CMAKE_SYSTEM:系統全名,如 "Linux-2.4.22″,"FreeBSD-5.4-R ...
- 一文详解CMakeLists文件编写语法规则详解
作者丨zhanghm1995@blog 来源丨https://blog.csdn.net/zhanghm1995/article/details/80902807 编辑丨3D视觉工坊 基本语法规则 C ...
- PX4 CMakeLists.txt 文件剖析
PX4 CMakeLists.txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析, 见这里, 这里进一步对 PX4 的 CMakeLists.txt 文件结构进行进一步的 ...
- 熟悉 CMake(二)—— 以一个实例说明 CMakeLists.txt 文件的编写
原文请见 cmake使用总结(转)-工程主目录CMakeList文件编写 在 Linux 下进行开发很多人选择编写 makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量 ...
- CMake下载地址及语法介绍
CMake简介 CMake是一种跨平台的开源项目管理工具,所做的事其实就是告诉编译器如何去编译链接源代码.与之相似的是直接编写makefile文件,但makefile最大的缺点就是不能跨平台,一旦更换 ...
最新文章
- 独家 | 一文读懂Apache Flink技术
- 团队博客作业-团队个人贡献分分配规则
- 多线程面试题之原子性、可见性、有序性
- 带CheckBox的CListCtrl,源码可下载
- 前端学习(2324):angular初步使用
- 三星发布110寸大屏MicroLED面板电视
- 将用户添加到sudoers_Linux系统如何添加普通用户到 sudoers 文件
- Storm处理流程, 基本参数配置
- 土豪也不会告诉你的IBM X3850 X5
- Kali Linux 暴力破解学校办公室WiFi 总结
- 算法训练 - 黑色星期五 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又
- 微信公众号已认证怎么改名字,公众号昵称可以改吗?
- ThinkPad E450(c)添加或者更换内存条的一些问题
- 以红酒数据集分类为例做决策树的可视化
- kitti 数据集点云使用笔记
- pycharm 字体颜色更改
- GeForce和TITAN产品 显卡计算能力
- 安卓恶意应用代码分析
- float与double的精度问题
- 【云开发】小程序端操作数据库详解