Cmake学习
文章目录
初识Cmake
官网:www.cmake.org
优点:
1、开源代码,使用类BSD许可发布。
2、跨平台,并可以生成native编译配置文件,在linux/Unix平台,生成makefile,在苹果平台可以生成Xcode,在windows平台,可以生成MSVC的工程文件。
3、能够管理大型项目。
4、简化编译构建过程和编译过程。cmake的工具链:cmake+make。
5、高效率,因为cmake在工具链中没有libtool。
6、可扩展,可以为cmake编写特定功能的模块,扩展cmake功能。
缺点:
1、cmake只是看起来比较简单,使用并不简单;
2、每个项目使用一个CMakeLists.txt(每个目录一个),使用的是cmake语法。
3、cmake跟已有体系配合不是特别的理想,比如pkgconfig。
安装Cmake
命令行安装
sudo apt install cmake
源码编译安装
1、更新一下g++
sudo apt-get install g++
2、先检查是否有cmake
which cmake
如果显示了路径,说明含有cmake,设法卸载掉,可以使用sudo apt-get remove cmake卸载。
3、下载cmake
下载地址:https://cmake.org/download/
4、解压cmake
在cmake源码所在文件夹中打开命令终端,解压文件:
tar -zxvf cmake-3.23.0-rc1.tar.gz
5、进入解压后的cmake文件夹中,进行检查
比如上面的cmake-3.23.0-rc1.tar.gz经过解压后,会有一个cmake-3.23.0-rc1文件夹,进入这个文件夹。
cd cmake-3.23.0-rc1
./bootstrap
6、 编译构造
make
7、安装
sudo make install
8、检查
查看cmake版本: cmake --version
查看cmake位置: which cmake
cmake的helloworld
1、准备工作
先在/home/lrh/test 目录下建立两个文件,分别是hello.cpp和CMakeLists.txt。内容如下:
//hello.cpp
#include<iostream>
using namespace std;
int main(int argc,char *argv[])
{
cout<<"Hello World"<<endl;
return 0;
}
//CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(HELLO)
add_executable(hello hello.cpp)
2、开始构建
外部构建:在当前目录下创建一个build目录,
mkdir build #创建目录
cd build #切换目录
cmake .. #构建项目生成Makefile
make #编译Makefile生成可执行程序
./hello #运行可执行程序
以上是cmake构建的全部过程。
CMake常用语法
前言:
#cmake的内置命令是不区分大小写的
#因此 add_subdirectory 与 ADD_SUBDIRECTORY 作用一致。
#cmake的所有变量都是区分大小写的
#函数命令
#设置cmake最小版本要求3.20
cmake_minimum_requried( VERSION 3.20)
#project 定义工程名称 并可指定工程支持的语言
语法:project(projectname [CXX][C][JAVA]) #方括号为可选参数
如:project(HELLOWORLD)
#set 显示的定义变量
语法: set(VAR [VALUE] CACHE TYPE DOCSTRING [FORCE])
如 set(SRC sayhello.cpp hello.cpp) #定义SRC变量,其值为sayhello.cpp hello.cpp
#include_directories 向工程添加多个特定的头文件搜索路径 相当于指定g++编译器的-I参数
语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2...)
#将/usr/include/myincludefoleser和./include 添加到头文件搜索路径
如:include_directories(/usr/include/myincludefoleser ./include)
#link_directories 向工程添加多个特定的库文件搜索路径 相当于指定g++编译器的-L 参数
语法: link_directories[dir1 dir2 ...]
#将 /usr/lib/mylibfolder 和./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)
#add_library 生成库文件
语法 add_library(libname [SHARED][STATIC][MODULE][EXCLUDE_FROM_ALL] source1 source2 ...sourceN)
通过变量SRC 生成libhello.so共享库
add_library(hello SHARED ${SRC})
#add_compile_options 添加编程参数
语法:add_complie_options(<option>...)
添加编译参数 -Wall -std=c++11
add_compile_options(-Wall -std=c++11 -O2)
#add_executable 生成可执行文件
语法:add_executable(exename source1 source2 ... sourceN)
编译main.cpp 生成可执行文件main
add_executable(main main.cpp)
#target_link_libraries 为target添加需要链接的共享库 相同于指定g++ 编译器-l参数
语法 : target_link_libraries(target libray1<debug | optimized> library2...)
将hello 动态库文件链接到可执行文件main
target_link_libraries(main hello)
#add_subdirectory 向当前工程添加存放源文件的子目录 并可以指定中间二进制和目标二进制存放的位置
语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
添加src目录,src中需有一个CMakeLists.txt
add_subdirectory(src)
#aux_source_directory 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
语法:aux_source_directory(dir VARIABLE)
定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main SRC)
#GLOB 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中
如将./src所有的.cpp文件放到SRC_LISTS变量中
file(GLOB SRC_LISTS "./src/*.cpp")
#message :为用户显示一条消息。相当于printf函数输出
message(FATAL_ERROR " FATAL: In-source builds are not allowed.")
CMake常用变量
#CMAKE_C_FLAGS 表示 gcc编译选项
#CMAKE_CXX_FLAGS 表示 g++编译选项
#在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set(CMAKE_CXX_FLAGS “S{CMAKE_CXX_FLAGS} -std=c++11”)
#CMAKE_BUILD_TYPE 编译类型 (Debug ,Release)
#设定编译类型为debug 调试时需要选择debug
set(CMAKE_BUILD_TYPE Dubug)
#设定编译类型为release ,发布时需要选择release
set(CMAKE_BUILD_TYPE Releasse)
#CMAKE_C_COMPILER 指定C编译器工具链
set(CMAKE_C_COMPILER /usr/bin/gcc)
#CMAKE_CXX_COMPILER 指定C++编译器工具链
set(CMAKE_CXX_COMPILER /usr/bin/g++)
#EXECUTABLE_OUT_PATH 可执行文件输出的存放路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
#LIBRARY_OUTPUT_PATH 库文件输出的存放路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
CMAKE 编译工程
CMake目录结构:项目主目录存在一个CMakeLists.txt文件
两种方式设置编译规则
1、包含源文件的子文件包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可
2、包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中
6.1 编程流程
在linux平台下使用CMake构建C/C++工程的流程如下:
手动编写CMakeLists.txt
创建外部构建方式 1、mkdir build 2、cd build
执行命令cmake PATH 生成目录Makefile (PATH 是顶层CmakeLists.txt所在的目录.)
执行命令make进行编译。
参考链接
https://blog.csdn.net/yuanzhoulvpi/article/details/122938078
https://blog.csdn.net/qq_34796146/article/details/119064986