Linux之Cmake学习

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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux系统下,使用CMake进行编译的指令如下: 1. 首先,你需要安装CMake。你可以从官方网站下载CMake的源代码,并进行编译安装,或者使用包管理器进行安装。 2. 下载CMake的源代码,并解压缩: ```shell wget https://github.com/Kitware/CMake/releases/download/v3.16.8/cmake-3.16.8.tar.gz tar -xzf cmake-3.16.8.tar.gz ``` 3. 进入解压缩后的目录,并创建一个build文件夹: ```shell cd cmake-3.16.8 mkdir build ``` 4. 进入build文件夹,并执行cmake命令,生成Makefile和其他构建文件: ```shell cd build cmake .. ``` 5. 执行make命令,进行编译: ```shell make ``` 通过以上步骤,你可以使用CMakeLinux系统下进行编译。这些指令会帮助你在当前目录下创建一个build文件夹,并在其中生成Makefile和其他构建文件,然后使用make命令进行编译。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [paddlepaddle-2.5.0rc1-cp37-cp37m-linux-aarch64.whl](https://download.csdn.net/download/musicsxf/87917049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Linux学习笔记:使用Cmake编译](https://blog.csdn.net/dingxiaoxv/article/details/126921859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [linux-cmake常用指令](https://blog.csdn.net/m0_37792813/article/details/126403669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值