linux应用开发之cmake使用
linux编译规则
在windows开发中我们习惯使用集成的开发环境。但是在kinux环境下,我们使用的开发环境集成度没那么高,因此需要我们多一些步骤,无需担心,熟悉这些编译规则和工具之后,我们依旧可以在linux开发中得心应手。
程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,链接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可执行文件中包含了库代码的一份完整拷贝,缺点是被多次使用就会多份冗余拷贝。还有一种库,就是程序在开始运行后调用库函数时才被载入,这种库独立于现有的程序,其本身不可执行,但包含着程序需要调用的一些函数,这种库称为动态(链接)库(Dynamic Link Library)。
linux下的gcc/g++
首先我们要知道我们即便是编译最简单的‘hellow world’,我们依旧需要导入基本的库函数
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
要知道我们之前使用最基本的一些函数,比如cout()printf(),这些都是已经存在且实现过的函数,理论上来说我们待用这些函数的时候必须告诉机器这些函数是在哪里实现的,机器在遍历链接的时候才能正确找到你调用的函数。我们都是站在巨人的肩膀上编程的,因此我们在使用巨人提前封装好的库函数时,我们据必须告诉机器这么库函数在哪!不同于windows平台,你可以使用图像化交互的方式配置完成库函数路径。在linux平台上你需要在编译之前使用指令告诉机器你的具体的编译规则和各种支持(包括库函数)。widows平台下,静态链接库是.lib文件,动态库文件是.dl文件。在linux平台下,静态链接库是.a文件,动态链接库是.so文件。
这时候你定义一个main.cPP文件,输入上面的代码,然后执行
g++ main.cpp -o mian
机器就会执行编译,生成main可执行文件。
make工具
上面的过程看是很简单?但大家一个小积木和建造一座摩天大楼好像有点相似,但又有很大不同。这就是工程量的区别。一旦项目复杂一点或者依赖多了起来,单纯使用g++就会显得很笨重。我不否认你可以使用g++一点不出错地成功建造出摩天大楼,那会不会有点自讨苦吃?这是我们就有了make工具,要知道人类所有工具的出现就是提升效率,使用make工具就避免我们一行一行在命令行敲编译规则。使用make工具将编译规则写进MakeFile文件,在执行make的时候,机器就会读取MakeFile文件,根据里面的内容编译你的工程。相关的MakeFile指令怎么写,网上有很多教程,本次就阐述了。make工具确实能提升不好开发时的效率,但还不够!这时候就有了cmake工具,在make工具基础上又大大提高了开发效率。
cmake工具(推荐)
使用cmake工具可以帮我自动生成MakeFile文件,只需要我们写几行cmake指令。如果你的工程相对复杂,你的MakeFile文件可能需要几百行,但使用cmake只需要十几行就够了!以我之前的的一个小项目为例
https://www.ebaina.com/articles/140000017425
这份项目的CMakeLists.txt文件内容为
CMAKE_MINIMUM_REQUIRED(VERSION 3.8) # 指定CMake的最低版本为3.8
PROJECT(UART) # 定义项目名称为UART
SET(CMAKE_SYSTEM_NAME Linux) # 设置系统名称为Linux
SET(CMAKE_C_COMPILER "aarch64-mix210-linux-gcc") # 指定C编译器为aarch64-mix210-linux-gcc
SET(CMAKE_CXX_COMPILER "aarch64-mix210-linux-g++") # 指定C++编译器为aarch64-mix210-linux-g++
SET(CMAKE_CXX_FLAGS "-static") # 设置C++编译器标志为静态链接
SET(TOOLCHAIN_DIR "/opt/linux/x86-arm") # 设置工具链目录
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}) # 设置CMake查找根路径为工具链目录
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 设置CMake查找程序时不使用工具链目录
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 设置CMake查找库文件时只使用工具链目录
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 设置CMake查找头文件时只使用工具链目录
aux_source_directory(${CMAKE_SOURCE_DIR}/source DIR_SRCS) # 查找source目录下的所有源文件并存储在DIR_SRCS变量中
include_directories(${CMAKE_SOURCE_DIR}/include) # 包含include目录中的头文件
ADD_EXECUTABLE(UART ${DIR_SRCS}) # 添加可执行文件UART,并包含DIR_SRCS中的源文件
find_package(Threads REQUIRED) # 查找并引入线程库
target_link_libraries(UART Threads::Threads) # 将线程库链接到UART可执行文件
哪怕是你是上万行代码的项目,你依旧只需要这短短几十行代码的CMakeLists.txt。
- 分享
- 举报
-
浏览量:1067次2024-03-19 11:42:03
-
浏览量:562次2023-11-24 15:35:13
-
浏览量:2531次2020-08-12 20:09:12
-
浏览量:1648次2023-05-16 15:43:05
-
浏览量:863次2023-05-06 13:40:15
-
浏览量:557次2023-08-14 17:53:58
-
浏览量:2853次2017-12-02 21:41:08
-
浏览量:3753次2020-07-17 16:50:14
-
2023-11-28 10:58:59
-
浏览量:2323次2020-08-20 18:03:14
-
浏览量:2228次2020-08-18 20:05:11
-
浏览量:1182次2023-09-01 13:25:40
-
浏览量:1967次2020-05-20 11:02:47
-
浏览量:3421次2020-08-29 16:50:56
-
浏览量:1668次2022-11-30 09:49:56
-
浏览量:569次2024-01-16 18:03:56
-
浏览量:9030次2017-11-30 20:27:01
-
浏览量:1911次2020-08-03 11:21:38
-
浏览量:4531次2021-07-22 10:46:17
- QT5.9移植到海思HI3520设备上运行
- Hi3518EV200实现H264视频采集的源码及流程详解(不依赖SAMPLE库)
- 海思3518E开发笔记2.6——海思VPSS(Video Process Sub-System)模块详解
- 国科微 GK7201V300 liteos 1920X1080P30F
- 常用高压mos管SVF4N65/SVF7N65/SVF10N65/SVF12N65参数
- 海思SDK编译填坑
- HI3518EV300的USB接口及SDIO接口设计参考
- 关于linux定时器和Hi3536的VDEC解码
- QT5.9移植到海思HI3520设备上运行
- HI3518EV200主时钟及RTC时钟晶体选型要求
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
wby
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明