linux-CMake

news2024/11/17 13:47:34

linux-CMake

  • 1.安装CMake工具
  • 2.单个源文件
  • 3.多个源文件
  • 4.生成库文件
  • 5.将源文件组织到不同的目录下
  • 6.可执行文件和库文件放置到单独的目录下
  • 7.常见的命令

CMake使用。

1.安装CMake工具

sudo apt-get install cmake

在这里插入图片描述

2.单个源文件

1.先在文件夹里创建两个文件:main.c,CMakeLists.txt。

在这里插入图片描述
2.在main.c文件里加入一段程序。

#include <stdio.h>

int main()
{
	 printf("Hello World!\n");
	 return 0;
}

3.在CMakeLists.txt文件里加入命令。

project(hello)
add_executable(hello ./main.c)

这两句的意思是:project(工程名称)设置工程的名称
add_executable(可执行文字名称,源代码) 设置生成的可执行文件的名字和要连接的源文件。
4.执行cmke命令
在这里插入图片描述
5.执行make命令
在这里插入图片描述
此时可以看到一个可执行文件hello生成
6.执行一下看是否和源文件一样
在这里插入图片描述
结果输出一样。
7.使用 out-of-source 方式构建
这时会发现目录比较杂乱,当我们需要清理 cmake 产生的文件时将变得非常麻烦。此时可以将构建过程生成的文件与源文件分离开来。
将cmake编译生成的文件全部清零下,只保留最开始的两个文件。然后在工程目录下创建一个build的目录,
在这里插入图片描述
这样 cmake 生成的中间文件以及 make 编译生成的可执行文件就全部在 build 目录下了,如果要清理工程,直接删除 build 目录即可,这样就方便多了。

3.多个源文件

1.创建三个文件hello.h hello.c main.c我们在main.c里调用hello.c里的函数

在这里插入图片描述
2.在这三个文件里填写以下函数

//hello.h
#ifndef __TEST_HELLO_
#define __TEST_HELLO_
void hello(const char *name);
#endif //__TEST_HELLO_

//hellow.c
#include <stdio.h>
#include "hello.h"

void hello(const char *name)
{
 printf("Hello %s!\n", name);
}

//main.c
#include "hello.h"
int main(void)
{
 hello("World");
 return 0;
}

3.填写CMakeLists.txt

project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})

第一句同样是 设置工程名称。
第二句 设置了一个SRC_LIST 的变量,该变量是一个源文件列表,记录了生成可执行文件hello需要的源文件main.c hello.c。
第三句 设置可执行文件的名称和所用的源文件。
同样也可以直接写在add_executable里

add_executable(hello main.c hello.c)

在这里插入图片描述

4.生成库文件

除了生成可执行文件 hello 之外,我们还需要将 hello.c 编译为静态库文件或者动态库文件。在上一个的基础上对 CMakeLists.txt 文件进行修改,如下所示:

project(HELLO)
add_library(libhello hello.c)
add_executable(hello main.c)
target_link_libraries(hello libhello)

新加了两条新的语句:add_library(libhello hello.c) 意思是把hello.c文件编译为静态库。第一个参数为库文件的名字(不用加前缀和后缀),第二个位所有的源文件。静态库的前缀是lib,后缀为.a。动态库的后缀是.so。(add_library(libhello SHARED hello.c) 链接为动态库)
target_link_libraries(hello libhello) 意思是目标指定依赖库。将其链接进hello程序。

在这里插入图片描述
生成了liblibhello.a静态库,你会发现这个名字和我们填的libhello不一样还十分的不好看。造成这个情况的原因是,add_library()会自动的添加静态库的前缀lib。那如果将我们填写的libhello改成hello是不是就可以了。实际是不可以的因为hello我们在下面生成可执行文件使用的也是这个名称,两者不能一样。那该怎么更改名字,可以使用下面这个命令来。

set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_library(libhello  hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
add_executable(hello main.c)
target_link_libraries(hello libhello)

除了添加 set_target_properties 命令之外,我们还加入了 cmake_minimum_required 命令,该命令用于设置当前工程的 cmake 最低版本号要求,当然这个并不是强制性的,但是最好还是加上。
在这里插入图片描述
这时生成的静态库就是我们想要的libhello.a了。

5.将源文件组织到不同的目录下

1.先将工程整理一下。
在这里插入图片描述
2.编写最外面的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_subdirectory(libhello)
add_subdirectory(src)

add_subdirectory()用来告诉cmke去子目录libhello,src中寻找新的CMakeLists.txt文件来解析它;
3.编写src 目录下的 CMakeLists.tx文件

include_directories(${PROJECT_SOURCE_DIR}/libhello)
add_executable(hello main.c)
target_link_libraries(hello libhello)

include_directories()用来指明头文件所在的路径,并且使用到了 PROJECT_SOURCE_DIR 变量,该变量指向了一个路径,从命名上可知,该变量表示工程源码的目录。
4.编写libhello目录下的CMakeLists.txt文件

add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")

5.最后到build文件里构建,编译,最终会得到可执行文件 hello(build/src/hello)和库文件 libhello.a(build/libhello/libhello.a)

6.可执行文件和库文件放置到单独的目录下

1.将 src 目录下的 CMakeList.txt 文件进行修改

include_directories(${PROJECT_SOURCE_DIR}/libhello)

add_executable(hello main.c)
target_link_libraries(hello libhello)

EXECUTABLE_OUTPUT_PATH 变量控制可执行文件的输出路径
2.然后再对 libhello 目录下的 CMakeList.txt 文件进行修改

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")

LIBRARY_OUTPUT_PATH 变量控制库文件的输出路径

7.常见的命令

command说明
add_executable可执行程序目标
add_library库文件目标
add_subdirectory去指定目录中寻找新的 CMakeLists.txt 文件
aux_source_directory收集目录中的文件名并赋值给变量
cmake_minimum_required设置 cmake 的最低版本号要求
get_target_property获取目标的属性
include_directories设置所有目标需要链接的库
list列表相关的操作件
message用于打印、输出信息
project设置工程名字
set设置变量
set_target_properties设置目标属性
target_include_directories设置指定目标头文件的搜索路径
target_link_libraries设置指定目标库文件的搜索路径
target_sources设置指定目标所需的源文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

excel统计分析(3): 一元线性回归分析

简介 用途&#xff1a;研究两个具有线性关系的变量之间的关系。 一元线性回归分析模型&#xff1a; ab参数由公式可得&#xff1a; 判定系数R2&#xff1a;评估回归模型的拟合效果。值越接近1&#xff0c;说明拟合效果越好&#xff1b;值越接近0&#xff0c;说明拟合效果越…

回归预测|基于小龙虾优化LightGBM的数据回归预测Matlab程序COA-LightGBM 多特征输入单输出 含基础模型

回归预测|基于小龙虾优化LightGBM的数据回归预测Matlab程序COA-LightGBM 多特征输入单输出 含基础模型 文章目录 一、基本原理COA-LightGBM 多特征输入单输出回归预测的原理和流程2.1 蟋蟀优化算法&#xff08;COA&#xff09;2.2 LightGBM3.1 数据准备3.2 模型构建3.3 参数优化…

6.8方框滤波

基本概念 方框滤波&#xff08;Box Filter&#xff09;是一种基本的图像处理技术&#xff0c;用于对图像进行平滑处理或模糊效果。它通过在图像上应用一个固定大小的方框核&#xff08;通常是矩形&#xff09;&#xff0c;计算该区域内像素值的平均值来替换中心像素的值。这种…

C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布

一&#xff1a;让 SQLiteExpert 支持&#xff08;cipher&#xff09;加密数据库 SQLiteExpert 作为SQlite 的管理工具&#xff0c;默认不支持加密数据库的&#xff0c;使其成为支持&#xff08;cipher&#xff09;加密数据库的管理工具&#xff0c;需要添加e_sqlcipher.dll &…

服务器端请求伪造(SSRF)漏洞解析

免责申明 本文仅是用于学习检测自己搭建的靶场环境有关SSRF的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法规内…

828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp

准备国庆之际&#xff0c;客户要搭个 H5 商城系统&#xff0c;这系统好不容易开发好啦&#xff0c;就差选个合适的服务器上线。那可真是挑花了眼&#xff0c;不知道哪款性价比高呀&#xff01;就像在琳琅满目的选择前。最终慧眼识珠&#xff0c;选择了华为云 Flexus X。至于为什…

嵌入式学习--数据结构+算法

嵌入式学习--数据结构算法 数据结构 1.1数据 1.2逻辑结构 1.3存储结构 1&#xff09;顺序存储结构 2&#xff09;链式存储结构 1.4操作&#xff08;数据的运算&#xff09; 算法 2.1算法与程序 2.2算法与数据结构 2.3算法的特性 2.4如何评价一个算法的好坏&#xff1f; 2.5时间…

在IDEA中构建Jar包,安装Jar包到Maven仓库并在Maven项目中使用

文章目录 0. 关于本文1. IDEA构建Jar包1.1 准备一份Java代码&#xff08;就是你要构建工件的代码&#xff09;1.2 进行如下步骤构建工件 2. 关于Maven3. 将Jar包安装到Maven仓库4. 使用安装的Jar包依赖 0. 关于本文 本文内容&#xff1a; 借助IDEA构建Jar包将Jar包安装到Mave…

设计模式之门面(Facade)模式

前言 在组建构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题、甚至跟本无法实现。采用添加一层&#xff08;间接&#xff09;稳定接口&#xff0c;来隔离本来互相紧密关联的接口是一种常见的解决方案 定义 “接口隔离” 模式。为子系统中的一组接口提供一个一…

【北京二号卫星】

北京二号卫星 北京二号卫星是中国自主研制的高分辨率遥感卫星之一&#xff0c;具有多方面的特点和广泛的应用价值。以下是对北京二号卫星的详细介绍&#xff1a; 一、基本信息 名称&#xff1a;北京二号类型&#xff1a;民用商业遥感卫星星座组成&#xff1a;由三颗高分辨率卫…

【PDCCH(一)】

LTE/NR中&#xff0c;采用了OFDM正交频分复用方式&#xff0c;也就是在频域上使用多个子载波&#xff0c;这些子载波互相正交&#xff1b;在时域上采用帧结构的方式&#xff0c;用不同的帧结构去区分不同的用户&#xff0c;不同的资源&#xff0c;信道等等。 所以我们常常把时间…

校园外卖系统SpringBoot免费分享

今天我们分享一个非常实用的校园外卖系统&#xff0c;基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的瑞吉外卖案例项目&#xff0c;经过站长的进一步改进和优化&#xff0c;提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue…

web前端-CSS引入方式

一、内部样式表 内部样式表(内嵌样式表)是写到html页面内部,是将所有的 CSS 代码抽取出来,单独放到一个<styie>标签中。 注意: ① <style>标签理论上可以放在 HTML文档的任何地方&#xff0c;但一般会放在文档的<head>标签中 ② 通过此种方式&#xff0c;可…

【多样化的思想】基于执行档案的测试

下面我们讨论另一种关于多样性的观点。我们知道&#xff0c;对被测对象而言&#xff0c;测试输入空间代表的是各种可能的外部环境条件。如果两个测试输入点距离比较远&#xff0c;说明在这两个点上&#xff0c;被测对象所面对的外部环境条件很不一样&#xff0c;所以我们说&…

RabbitMQ的高级特性-消息确认机制

对于RabbitMQ发送消息到消费端的可靠性保障 引入&#xff1a;发送者发送消息后&#xff0c;到达消费端之后会出现一下两种情况&#xff1a; ①消息处理成功 ②消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第两种情况, 就会造成消息丢失&#xff0…

fmql之字符驱动设备(3)-并发与竞争

学会使用设备树后&#xff0c;要学习linux驱动编写中容易出现的”并发与竞争“。 代码是在之前代码的基础上进行修改。 并发与竞争 &#xff08;本部分来自于正点原子pdf&#xff09; 什么是并发与竞争&#xff0c;为什么会出现并发与竞争&#xff1a; 要保护的内容是&#…

基于TSN的实时通信网络延迟评估技术

论文标题&#xff1a;A TSN-based Technique for Real-Time Latency Evaluation in Communication Networks 作者信息&#xff1a; Alberto Morato, Claudio Zunino, Manuel Cheminod, Stefano Vitturi&#xff0c;来自意大利国家研究委员会&#xff0c;CNR-IEIIT。电子邮件:…

深度学习实战TT100K中国交通标志检测【数据集+YOLOv5模型+源码+PyQt5界面】

AI深度学习TT100k交通标志识别 文章目录 研究背景代码下载链接一、效果演示1.1 图像演示1.2 视频演示 二、技术原理2.1 整体流程2.2 TT100K中国交通标志数据集介绍2.3 YOLOV5 TT100K中国交通标志检测原理2.3.1 概述2.3.2 输入层2.3.3 Backbone层2.3.4 Backbone层2.3.5 Head层 2…

【人人保-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【时时三省】(C语言基础)指针笔试题6

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 笔试题6 首先aa&#xff3b;2&#xff3d;&#xff3b;5&#xff3d;是二维数组 也就是说它有两行第一行是1 2 3 4 5 第二行是6 7 8 9 10 然后&aa取出的数组的地址 &aa1就直接跳到第…