CMake Practice 学习笔记四---使用动静态库

news/2025/2/23 6:40:44/

任务:

编写一个程序使用我们上一届构建的共享库

1、准备工作

在/backup/cmake目录建立t4目录

mkdir t4

在t4目录中建立src目录,并编写源文件main.c

cd t4 
mkdir src && cd src
touch main.c

main.c的内容如下:

#include <hello.h>
int main()
{HelloFunc();return 0;
}

编写工程主文件CMakeLists.txt如下

PROJECT(NEWHELLO)# 头文件搜索路径
INCLUDE_DIRECTORIES(/usr/include/hello)ADD_SUBDIRECTORY(src)

编写src/CMakeLists.txt如下

# 生成target二进制可执行文件
ADD_EXECUTABLE(main mian.c)# 为target链接共享库
# 可以link动态库
TARGET_LINK_LIBRARIES(main hello) # hello 也可以写成libhello.so
# 也可以Link静态库
TARGET_LINK_LIBRARIES(main libhello.a)

2、构建

新建buil目录并进入进行构建

cmake ..
make

这样我们就得到了一个连接到libhello的可执行程序main,位于build/src,目录下,运行main的结果是输出:

Hello World

检查下main的链接情况:

如果链接动态库:

可以清楚的看到main确实链接了共享库libhello,而且是链接的动态库libhello.so.1

如果链接的是静态库:

main链接到libhello.a(这里我也不大懂)

问:这里在工程主文件CMakeLists.txt中指定了头文件的搜索路径,但是没有在src/CMakeLists.txt指定共享库的路径,而是直接进行链接,这样说不过去呀?

前面我们将头文件和共享库安装到系统目录/usr/lib和/usr/include/hello中了。会不会/usr/lib默认是库的存放位置。

还真是哦,不信你看,所以上一步安装的位置要对哦: /lib、/usr/lib、/usr/local/lib区别_XX風的博客-CSDN博客_/usr/lib

问:如果我没有把共享库安装/usr/lib,比如说我安装到了/temp/lib那我需要指定共享库路径吗?

是的哦,在工程主文件CMakeLists.txt中添加:

LINK_DIRECTORIES(/temp/lib)

 参考:

从从C++学习(二六六)LINK_DIRECTORIES_hankern的博客-CSDN博客


http://www.ppmy.cn/news/73696.html

相关文章

如何用 ChatGPT 帮你10分钟读完数据库论文

本周&#xff0c;OpenAI 向所有 ChatGPT Plus 用户开放了两个重要功能&#xff1a; Web Browsing 和 Plugins 它俩都需要用户自己开启&#xff0c;才能使用&#xff0c;如下&#xff1a; 作为对数据库论文的爱好者&#xff0c;我第一款挑选的 Plugin 便是 ChatWithPDF,毕竟真的…

2023-05-18 题目

2023-05-18 题目 1、String 字符串 String 不是基本数据类型&#xff0c;且是不能被继承的&#xff0c;因为string类被final修饰 //源码 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {}常见题目&#xff1a; publi…

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(下)

MyEclipse v2022.1.0正式版下载 三、设计编辑基础 “设计”窗口由所见即所得的网页设计画布和UI控制面板组成。在此窗口中&#xff0c;您可以插入、编辑、删除和移动 HTML 和 JSP UI 控件和文本。拖放操作可以轻松实现重新定位设计画布上的UI控件。扩展的复制/粘贴操作能够将…

SNK施努卡 - 工业视觉定位检测 工业视觉检测原理

工业视觉检测的原理是通过传感检测器检测到物体已靠近工业相机系统的视场中心&#xff0c;并向图像采集部分发送触发脉冲。对图像进行处理、分析和识别&#xff0c;得到测量结果或逻辑控制值。最后&#xff0c;对结果进行处理&#xff0c;以控制流水线的动作&#xff0c;执行定…

自动化测试与手工测试的区别是什么?

目录 什么是自动化测试? 自动化测试与手工测试的区别 自动化测试的困境 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试&#xff0c;它是软件测试的一个重要组成 部分&#xff0c;能完成许多手工测试无法实现或难以实现的测试。能够正确、合理地…

2023-5-22-C++异常处理机制学习

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

【线性代数笔记】线性代数知识点总结、概念之间关系总结

矩阵的秩 1. 基础 初等变换不改变矩阵的秩。 阶梯形矩阵非零行的个数即为该矩阵的秩。 r ( A ) r ( A T ) r ( A T A ) r ( A A T ) r(\boldsymbol{A})r(\boldsymbol{A}^{\mathrm{T}})r(\boldsymbol{A}^{\mathrm{T}}\boldsymbol{A})r(\boldsymbol{A}\boldsymbol{A}^{\mat…

unity多线程Burst+Job System

Unity自己本身UnityEngine所使用的API是不能被多线程调用的&#xff0c;它没有向用户开放线程接口&#xff0c;所以Unity是不能使用多线程的&#xff0c;但是C#中可以使用多线程&#xff0c;Unity使用C#进行脚本编辑&#xff0c;故而Unity也可以通过C#来调用多线程。 JobSyste…