其他很好的总结
CMake教程系列-01-最小配置示例 - 知乎
CMake 保姆级教程(上) | 爱编程的大丙
10-补充(完结)_哔哩哔哩_bilibili
1、基本关键字
SET命令的补充
(1)SET命令设置执行标准
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)
(2) SET命令设置
set(HOME /home/robin/Linux/Sort)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
第一行:定义一个变量用于存储一个绝对路径
第二行:将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
如果这个路径中的子目录不存在,会自动生成,无需自己手动创建
作者: 苏丙榅
链接: https://subingwen.cn/cmake/CMake-primer/
MESSAGE关键字
向终端输出用户自定义的信息
主要包含三种信息
- SEND_ERROR,产生错误,生成过程被跳过
- STATUS,输出前缀--的信息,MESSAGE(STATUS "this is binary dir")
- FATAL_ERROR,立即终止cmake过程
ADD_EXECUTABLE关键字
生成可执行文件ADD_EXECUTABLE(hello main.cpp)
注意:工程名HELLO和生成的可执行文件hello是没有关系的
cmake 语法基本原则
变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
指令(参数1 参数2 ...)参数使用括弧扩起,参数之间使用空格或分号分开
指令是大小写无关的,参数和变量是大小写相关的,但推荐指令全部大写
语法注意:
set(SRC_LIST main.cpp)可以加双引号 set(SRC_LIST "mian.cpp"),如果名字中有空格则建议加引号
ADD_EXECUTABLE(hello main)后缀可以不写,他会自动取找.c和.cpp但是最好写后缀防止有main这样的可执行文件等文件。
2、内部构建和外部构建
内部构建产生的文件特别多,不方便清理
外部构建会把产生的临时文件放在build下,不会对源文件有任何影响,推荐使用外部构建方式
mkdir build
cd build
cmake ..
make
3、工程配置 make install
可以用src文件夹放源码,可以在工程中添加脚本runhello.sh来调用hello二进制。将构建后的文件放到bin子目录
3.1 将生成文件放到bin
mkdir src
mv main.cpp src/
cd src
touch CMakeList.txt(src 下)
cd ..
touch CMakeList.txt(工程下)
==========================
CMakeList.txt(工程下)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin) #关联src
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)#安装文件
INSTALL(PROGRAMS runhello.sh DESTINATION bin)#安装脚本
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)#安装doc下的hello.txt
CMakeList.txt(src下)
ADD_EXECUTABLE( hello main.cpp)
==================
ADD_SUBDIRECTORY指令
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个指令用于当前工程添加存放源文件的子目录,并且可以指定中间二进制和目标二进制的存放位置
EXCLUDE_FROM_ALL函数是将写的目录从编译中排除,如程序中的example
ADD_SUBDIRECTORY(src bin)将src子目录加入工程并指定编译输出(包含编译中间结果)路径为bin目录。如果不进行bin目录指定,那么编译结果在build/src目录下
3.2安装COPYRIGHT和README
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)
FILES文件
DESTINATION:写绝对路径,可以写相对路径,相对路径实际路径是
${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>
CMAKE_INSTALL_PREFIX 默认在、usr/local/
cmake -DCMAKE_INSTALL_PREFIX=/usr 在cmake时候指定CMAKE_INSTALL_PREFIX变量的路径
3.3安装脚本runhello.sh
PROGRAMS:非目标文件的可执行程序安装(比如脚本之类)
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
说明:实际安装到的是/usr/local/bin
3.4安装doc中的hello.txt
一是通过在doc目录建立CMakeList.txt,通过install下的file
二是直接在工程目录通过
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)
DIRECTORY后面连接的是所在source目录的相对路径
注意:abc/和abc有很大区别。不以/结尾,这个目录将被安装位目标路径下。以/结尾,这个目录中的内容将安装到目标路径
4、静态库和动态库构建
4.1
tree:
├── build
├── CMakeLists.txt
└── lib
├── CMakeLists.txt
├── hello.cpp
└── hello.h
hello.h:
#ifndef HELLO_H
#define HELLO_H
void HelloFunc();
#endif
hello.cpp
#include "hello.h"
#include <iostream>
void HelloFunc(){
std::cout<<"hello world"<<std::endl;
}
CMakeLists.txt外层
PROJECT(HELLO)
ADD_SUBDIRECTORY(lib bin)
CMakeLists.txt
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARE ${LIBHELLO_SRC})#生成共享库
ADD_LIBRARY
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
hello:就是正常的库名,生成的名字会加上lib,最终文件是libhello.lib
SHARED,动态库,STATIC,静态库
${LIBHELLO_SRC}:源文件
4.2同时构建静态库和动态库
SET_TARGET_PROPERTIES
这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本