cmake的使用方法: 编译生成库文件

news2024/12/23 12:40:29

一.  简介

前面文章学习了针对单个 .c文件,cmake 工具是如何编译的?

针对包含多个 .c文件,cmake工具又是如何编译的?文章如下:

cmake的使用方法: 单个源文件的编译-CSDN博客

cmake的使用方法: 多个源文件的编译-CSDN博客

本文来学习,cmake工具如何编译成静态库或动态库文件?

二.  cmake的使用方法: 生成库文件

如果需要将 hello.c 编译为静态库文件或者动态库文件。则 CMakeLists.txt 文件需要进行修改,

CMakeLists.txt 文件修改后内容 如下:
project(HELLO)
add_library(libhello hello.c)
add_executable(hello main.c)
target_link_libraries(hello libhello)

进入到 build 目录下,执行 cmake 、再执行 make 编译工程,编译完成之后,在 build 目录下就会生成可执行文件 hello 和库文件,即在该工程根目录下,依次输入如下命令:
cd build/
cmake ../
make
build 目录下就会生成可执行文件 hello 和库文件,如下所示:

CMakeLists.txt 文件解释

本例中我们使用到了 add_library 命令 target_link_libraries 命令

add_library 命令用于生成库文件,在本例中我们传入了两个参数,第一个参数表示库文件的名字,需要注意的是,这个名字是不包含前缀和后缀的名字;

注意:在 Linux 系统中,库文件的前缀是 lib,动态库文件的后缀是.so,而静态库文件的后缀是.a;所以,意味着最终生成的库文件对应的名字会自动添加上前缀和后缀。
第二个参数表示库文件对应的源文件。

add_library 命令生成了一个静态库文件 liblibhello.a,如果要生成动态库文件,可以这样做:

add_library(libhello SHARED hello.c) #生成动态库文件
add_library(libhello STATIC hello.c) #生成静态库文件 
target_link_libraries 命令目标指定依赖库,在本例中 hello.c 被编译为库文件,并将其链接进 hello 序。

三.  更改生成的库文件名字

本例中有一点非常不爽,生成的库为 liblibhello.a ,名字非常不好看;如果想生成 libhello.a 该怎么办?
直接修改 add_library 命令的参数,像下面这样可以吗?
答案是不行的,因为 hello 这个目标已经存在了( add_executable(hello main.c)),目标名对于整个工程来说是唯一的,不可出现相同名字的目标,所以这种方法肯定是不行的, 实际上我们只需要在 CMakeLists.txt 文件中添加下面这条命令即可:
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
set_target_properties 用于设置目标的属性,这里通过 set_target_properties 命令对 libhello 目标的OUTPUT_NAME 属性进行了设置,将其设置为 hello

CMakeLists.txt 文件经过更改后,内容如下:

cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_library(libhello SHARED 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 最低版本号要求,当然这个并不是强制性的,但是最好还是加上。

进入到 build 目录下,使用 cmake+make 编译整个工程:
cd build/
cmake ../
make
编译完成之后会发现,生成的库文件为 libhello.a

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

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

相关文章

Allegro如何删除死铜

Allegro如何删除死铜 敷铜说明 敷铜后铜皮会避让与自己不同的信号,避让后有的铜皮就会变成很小一块,这个最小形状的设置如下, 首先点击: 然后选中对应的铜皮: 在鼠标右键,选择“Parameters…” 改变上图红色框中的数值就能设置最小死铜的大小。 删除死铜的方法 1、首…

设计模式之装饰者模式DecoratorPattern(四)

一、概述 装饰者模式(Decorator Pattern)是一种用于动态地给一个对象添加一些额外的职责的设计模式。就增加功能来说,装饰者模式相比生成子类更为灵活。装饰者模式是一种对象结构型模式。 装饰者模式可以在不改变一个对象本身功能的基础上增…

前端开发报错:Extension context invalidated

这个错误一般是由浏览器的插件导致的 直接卸载 就没有问题了 注意检查 可能不是你自己的代码问题哦~

【如何使用SSH密钥验证提升服务器安全性及操作效率】(优雅的连接到自己的linux服务器)

文章目录 一、理论基础(不喜欢这部分的可直接看具体操作)1.为什么要看本文(为了zhuangbility)2.为什么要用密钥验证(更安全不易被攻破)3.密码验证与密钥验证的区别 二、具体操作1.生成密钥对1.1抉择&#x…

DataTrove:一款针对大规模文本数据的处理、过滤和消除重复数据工具

关于DataTrove DataTrove是一款针对大规模文本数据的处理、过滤和消除重复数据工具,该工具可以通过提供一组平台无关的可定制管道处理块,帮助广大研究人员从各种复杂脚本中解放出来,同时还允许我们轻松添加自定义功能。 DataTrove所实现的数…

再生龙clonezilla使用方法

目录 本文相关内容的介绍服务器窗口重定向引导进入再生龙系统检查本机操作系统的引导模式 再生龙基础功能选择选择 device-image选择ssh_server 网络配置ssh_server 配置ssh_server 镜像存储路径 再生龙抓取操作系统抓取镜像的命名 再生龙恢复操作系统拉取镜像的选择 本文相关内…

OpenCV4.9的点多边形测试(65)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的图像矩(64) 下一篇:OpenCV4.9的基于距离变换和分水岭算法的图像分割(66) Point Polygon Test(点多边形测试)是 OpenCV 库中的一个功能,用于判…

Windows安装mysql8.0.20

目录 1.下载安装包mysql8.0.20 2.配置MySQL环境变量 3.开始安装 ​编辑4.打开cmd命令行 5.Navicat测试连接 1.下载安装包mysql8.0.20 MySQL :: Download MySQL Community Server (Archived Versions) 2.配置MySQL环境变量 3.开始安装 将压缩包安装到指定路径 编辑my.ini文件…

一起Talk Android吧(第五百五十八回:lombok用法)

文章目录 1. 概述2. 使用方法3. 内容总结 各位看官们大家好,上一回中介绍了如何获取文件读写权限的知识,本章回中将介绍lombok相关的知识。闲话休提,言归正转,让我们一起Talk Android吧! 1. 概述 这是一个java库,用来…

[系统安全] 六十.威胁狩猎 (1)APT攻击检测及防御与常见APT组织的攻击案例分析

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

踏上R语言之旅:解锁数据世界的神秘密码(五)

线性与非线性模型及R使用 文章目录 线性与非线性模型及R使用一、数据的分类与模型选择1.变量的取值类型 二、广义线性模型广义线性模型概述Logistic模型 总结 一、数据的分类与模型选择 1.变量的取值类型 因变量记为y,解释变量记为x1,x2,… 因变量y一般…

Coursera: An Introduction to American Law 学习笔记 Week 05: Criminal Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 05: Criminal LawKey Criminal Law TermsSupplemental Re…

边沿JK触发器

边沿JK触发器 电路组成 & 逻辑符号 工作原理 Q n 1 D Q^{n1}D Qn1D J Q n ‾ K Q n ‾ \overline{\overline{JQ^n}KQ^n} JQn​KQn​ ( J Q n ) ( K ‾ Q n ‾ ) (JQ^n)(\overline{K}\overline{Q^n}) (JQn)(KQn​) J K ‾ J Q n ‾ K ‾ Q n Q n ‾ Q n J\over…

解救应用启动危机:Spring Boot的FailureAnalyzer机制

目录 一、走进FailureAnalyzer 二、在Spring Boot中如何生效 三、为什么可能需要自定义FailureAnalyzer 四、实现自定义基本步骤 (一)完整步骤要求 (二)注册方式说明 通过Spring Boot的spring.factories文件(建…

Java中的字符流

字符流字节流编码表 Java为什么可以区分字母和汉字 package day3; ​ import java.io.UnsupportedEncodingException; import java.lang.reflect.Array; import java.util.Arrays; ​ public class Test {public static void main(String[] args) throws UnsupportedEncoding…

文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件,你是否也曾感到手足无措、焦头烂额?现在,有了我们的批量文件管理工具,PDF文件的管理将变得前所未有的高效与简单! 首先,我们要…

用龙梦迷你电脑福珑2.0做web服务器

用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑,在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件,也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…

Android 开发部分基础工具使用

c调试 在NDK调试的时候,如果找不到 符号的话,我们可以在调试配置中添加符号地址的全路径一直到根目录:,xxx/armeabi-v7a: You must point the symbol search paths at the obj/local/ directory. This is also not a …

C++奇迹之旅:C++内存管理的机制初篇

文章目录 📝C/C内存分布🌠 C语言中动态内存管理方式🌉C内存管理方式 🌠new/delete操作内置类型🌉C与C链表构建对比 🚩总结 📝C/C内存分布 这是C/C中程序内存区域划分图: 数据段&am…

基于springboot+vue+Mysql的网上商城购物系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…