在程序中链接静态库 和 动态库

9. 链接库
在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库
或者静态库文件,cmake中也为我们提供了相关的加载动态库的命令
heheda@linux:~/Linux/loveDBTeacher-v3$ tree
.
├── CMakeLists.txt
├── include
│   └── head.h
├── main.c
├── shareLib
│   └── libcalc.so
└── staticLib└── libcalc.a3 directories, 5 files
heheda@linux:~/Linux/loveDBTeacher-v3$ 
  • mkdir shareLib
  • mkdir staticLib

把这篇文章 生成的libcalc.so放入shareLib、libcalc.a放入staticLib

一、在程序中链接静态库 

9.1 链接静态库
首先先指定静态库的路径
link_directories(<lib path>)
链接静态库
link_libraries(<static lib> [<static lib>...])
参数1:指定出要链接的静态库的名字可以是全名 libxxx.a也可以是掐头(lib)去尾(.a)之后的名字 xxx
参数2-N:要链接的其它静态库的名字# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 链接静态库, calc为静态库的名字
link_libraries(calc) 
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/staticLib)
# 链接静态库, calc为静态库的名字
link_libraries(calc)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式1: 使用aux_source_directory命令
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
  • CMakeLists.txt  (也可以写成这样) 
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/staticLib)
# 链接静态库, calc为静态库的名字
link_libraries(calc)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式2: 使用GLOB命令 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
# file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/*.c)
file(GLOB SRC_LIST ${CMAKE_CURRENT_LIST_DIR}/*.c)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
执行命令:
1.mkdir build
2.cd build
3.cmake ..
4.make
5.cd ../bin
6./app执行结果:
heheda@linux:~/Linux/loveDBTeacher-v3$ mkdir build
heheda@linux:~/Linux/loveDBTeacher-v3$ cd build
heheda@linux:~/Linux/loveDBTeacher-v3/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heheda/Linux/loveDBTeacher-v3/build
heheda@linux:~/Linux/loveDBTeacher-v3/build$ make
Scanning dependencies of target app
[ 50%] Building C object CMakeFiles/app.dir/main.c.o
[100%] Linking C executable ../bin/app
[100%] Built target app
heheda@linux:~/Linux/loveDBTeacher-v3/build$ cd ../bin
heheda@linux:~/Linux/loveDBTeacher-v3/bin$ ./app
a = 20, b = 12
a + b = 32
a - b = 8
a * b = 240
a / b = 1.666667
heheda@linux:~/Linux/loveDBTeacher-v3/bin$ 

二、在程序中链接动态库

9.2 链接动态库
动态库的链接和静态库是完全不同的:- 静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,静态库就被加载到内存中了- 动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启动并且调用了动态库中的函数的时候,动态库才会被加载到内存因此,在cmake中指定要链接的动态库的时候,应该将命令写到生成了可执行文件之后:
cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 添加并指定最终生成的可执行程序名
add_executable(app ${SRC_LIST})
# 指定可执行程序要链接的动态库名字
target_link_libraries(app pthread)
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/shareLib)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式1: 使用aux_source_directory命令
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST)
# 添加并指定最终生成的可执行程序名
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏# 指定可执行程序要链接的动态库名字
target_link_libraries(app calc)
  • CMakeLists.txt  (也可以写成这样) 
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/shareLib)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式2: 使用GLOB命令 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
# file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/*.c)
file(GLOB SRC_LIST ${CMAKE_CURRENT_LIST_DIR}/*.c)
# 添加并指定最终生成的可执行程序名
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏# 指定可执行程序要链接的动态库名字
target_link_libraries(app calc)

知识点:

10. 预定义宏宏                                        功能
PROJECT_SOURCE_DIR                使用cmake命令后紧跟的目录,一般是工程的根目录
PROJECT_BINARY_DIR                执行cmake命令的目录
CMAKE_CURRENT_SOURCE_DIR          当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR          target编译目录
EXECUTABLE_OUTPUT_PATH            重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH               重新定义目标链接库文件的存放位置
PROJECT_NAME                      返回通过PROJECT指令定义的项目名称
CMAKE_BINARY_DIR                  项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径

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

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

相关文章

鸿蒙开发-UI-组件-状态管理

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 文章目录 前言 一、什么是状态管理 二、管理组件拥有的状态 1.组件内状态 State装饰器 2.父子组价单向同步 Prop装饰器 3.父子双向同步 Link装…

Linux下动态库和静态库编译实践

Linux下动态库和静态库编译实践 背景动态库&#xff08;.so文件&#xff09;静态库(.a文件)关于GLIBC 背景 之前写过JNI的文章&#xff0c;在JNI实践过程中&#xff0c;也涉及到对动态库/静态库的一些编译实践&#xff0c;这里统一记录一下。 动态库&#xff08;.so文件&…

RWKV入门

主要参考资料 B站视频《【项目原作解读】RWKV Foundation侯皓文&#xff1a;新型RNN模型RWKV&#xff0c;结合Transformer的并行化训练优势和RNN的高效推理》 RWKV官网: https://www.rwkv.com/ 目录 前言RWKV由来模型架构关键结果劣势未来展望 前言 RNN无法并行化&#xff0c;…

CPU告警不用愁,用C语言编写CPU使用率限制程序

现在云服务已经深入千家万户了&#xff0c;不仅商用&#xff0c;私用也很多。很多云服务厂商也都有配套的服务器安全模块&#xff0c;可以检测网络流量异常、内存占用量和CPU占用率&#xff0c;并且允许人工设置告警阈值。例如&#xff0c;CPU持续大于90%10分钟&#xff0c;那么…

华为机试真题实战应用【赛题代码篇】-选修课(附Java、C++和python代码)

目录 题目描述 思路解析 代码实现 Java JS C++ 代码2 python

ESU毅速丨制造企业需不需要建设增材制造中心?

随着科技的不断发展&#xff0c;增材制造技术已经成为制造行业的新宠。越来越多的企业开始考虑建设增材制造中心&#xff0c;以提高生产效率、降低成本、加速产品创新。但是&#xff0c;对于制造企业来说&#xff0c;是否需要建设增材制造中心呢&#xff1f; 首先&#xff0c;我…

SpringCloud全链路灰度发布

日升时奋斗&#xff0c;日落时自省 目录 1、实现框架 2、负载均衡模块 3、封装负载均衡器 4、网关模块 5、服务模块 5.1、注册为灰度服务实例 5.2、设置负载均衡器 5.3、传递灰度标签 1、实现框架 Spring Cloud全链路灰色发布实现构架&#xff1a; 灰度发布的具体实现…

GEE机器学习——利用最短距离方法进行土地分类和精度评定

最短距离方法 最短距离方法(Minimum Distance)是一种常用的模式识别算法,用于计算样本之间的相似度或距离。该方法通过计算样本之间的欧氏距离或其他距离度量,来确定样本之间的相似程度或差异程度。 最短距离方法的具体步骤如下: 1. 数据准备:收集并准备用于训练的数据…

golang学习-函数

1、匿名函数 没有函数名的函数&#xff0c;格式如下&#xff1a; func(参数)返回值{ 函数体 } func main() {//将匿名函数保存到变量中sum : func(x, y int) int {return x y}fmt.Println(sum(10, 20)) //通过变量调用匿名函数//自执行函数:匿名函数定义完加()直接执行fu…

Java中的继承、方法覆盖和多态

一、继承 关于java语言当中的继承&#xff1a; 1.继承是面向对象三大特征之一&#xff0c;三大特征分别是&#xff1a;封装、继承、多态 2.继承最”基本“的作用是&#xff1a;代码复用。但是继承最”重要“的作用是&#xff1a;有了 继承才有了以后”方法的覆盖“和”多态机制…

利用Monte Carlo进行数值积分(二)

进步空间很大的算法版本 话说去年6月的一个周六&#xff0c;我很无聊地发了一个帖子&#xff0c;写了一个自己感觉有点无聊的帖子。 Matlab多重积分的两种实现【从六重积分到一百重积分】https://withstand.blog.csdn.net/article/details/127564478 这个帖子居然成了我这种懒…

springboot整合 hibernate详解

springboot整合 hibernate详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入研究Spring Boot与Hibernate整合的技术&#xff0c;解析其…

实现数字的千分位,表示,

重点如下 区分是否是负数区分是否有小数点使用正则表达式\B 是指非单词边界? 是正向查找?! 是负向查找 代表有一个或者多个() 是分组g 代表全局匹配 function splitStr(num) {// 转化成字符串let numStr ${num}let isNegative falseif (numStr.startsWith(-)) {isNegativ…

求解建公路问题

课程设计题目 求解建公路问题 课程设计目的 深入掌握 Prim 和 Kruskal算法在求解实际问题中的应用 问题描述 假设有 n 个村庄,编号从到,现在修建一些道路使任意两个村庄之间可以互相连通。所谓两个村庄 A 和B是连通的,指当且仅当A 和 B之间有一条道路或者存在一个村庄 C 使得…

QT通过QPdfWriter类实现pdf文件生成与输出

一.QPdfWriter类介绍 本文代码工程下载地址&#xff1a; https://download.csdn.net/download/xieliru/88736664?spm1001.2014.3001.5503 QPdfWrite是一个用于创建PDF文件的类&#xff0c;它是Qt库的一部分。它提供了一些方法和功能&#xff0c;使您能够创建和写入PDF文件。…

#Prompt##提示词工程##AIGC##LLM#使用大型预训练语言模型的关键考量

如果有不清楚的地方可以评论区留言&#xff0c;我会给大家补上的&#xff01; 本文包括&#xff1a; Prompt 的一些行业术语介绍 Prompt 写好提示词的方法经验介绍&#xff08;附示例教程&#xff09; LLM自身存在的问题&#xff08;可以用Prompt解决的以及无法用Prompt解决的&…

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中&#xff0c;U盘等移动存储设备已成为数据传输和存储的重要工具。 然而&#xff0c;随着U盘的广泛使用&#xff0c;也带来了潜在的安全风险&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对于随时会有数据泄露风险的企业而言&#xff0c;U盘的使用…

动态规划篇-00:解题思想与框架

引言 这篇文章是我的第一个专栏的第一篇文章。 在这篇文章中&#xff0c;我将总结我对于动态规划的认识与解题框架。这些思想和框架将会在后面的习题中反复出现。 解题思想 对于所有的算法题来说&#xff0c;本质上都是“穷举”——列出所有的结果&#xff0c;然后选择最优…

数组中差值的最大值(寻找一个数组中左侧最大值与右侧最小值的差值)

今天跟大伙分享下关于数组中差值的最大值&#xff08;寻找一个数组中左侧最大值与右侧最小值的差值&#xff09;的计算思路的算法题&#xff0c;解决方案有许多&#xff0c;这里简单进行抛砖引玉。 题目一&#xff1a; 数组中差值的最大值&#xff08;寻找一个数组中左侧最大值…

javascript编程求三个数中最大的数

使用javascript编程求输入的三个数中最大数&#xff0c;并在页面打印出来 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>…