linux应用开发之cmake使用

linux应用开发之cmake使用 wby 2024-05-27 16:47:51 618

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。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
wby
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
wby
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区