关于链接库的一些备忘

2024-06-21 03:38
文章标签 链接库 备忘

本文主要是介绍关于链接库的一些备忘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

预处理-编译-汇编-链接一直是薄弱之处,今日总结一些已掌握知识备忘:

预处理:宏(包括导出宏)展开,头文件;

编译:简单来讲是从自然语言到汇编语言的过程

汇编:从汇编到机器语言的过程

链接:将不同模块像拼图一样进行拼接

关于工程A想要调用工程B中的函数,有两种形式:

一种是以全局函数的形式导出如:“complier_api”;

#ifndef COMPILER_API
#define COMPILER_API
#endif

#ifdef COMPILER_EXPORTS
#  undef COMPILER_API
#define COMPILER_API FAULT_EXPORT
#endif

#ifdef COMPILER_IMPORTS
#  undef COMPILER_API
#define COMPILER_API FAULT_IMPORT
#endif

另一种是以对象的形式导出

#ifdef  COTSCOMPONENT_EXPORTS
#define CotsComponentDllDefine __declspec(dllexport)
#else
#define CotsComponentDllDefine __declspec(dllimport)
#endif

关于动态库与静态库:

静态库编译就是把所需要的库直接编译进程序文件里,目标电脑不需要安装运行库,但是程序文件会比较大。
动态库就是调用.dll里的库函数。运行程序的机子需要安装相应的运行库才可以,程序文件一般很小。

静态库和动态库链接分析
1、文件组成结构
静态库:lib   头文件
动态库:lib   dll  头文件
从组成上看,动态库和静态库的差异在于动态库多了一份dll文件,导致动态库可以独立存在
2、链接方式
静态库:只能静态链接
动态库:动态链接和静态链接
3、运行效果
静态库:相当于直接把代码段写入到exe或dll文件中
动态库:相当于与exe或dll形成了一种关系,exe或dll可以到动态库中去查找所需要的函数
4、差别:
静态库:不需要导出就可以被链接使用
动态库:需要导出后方可使用(动态链接)
5、编译
静态库:编译后只有lib文件
动态库:若没有导出函数刚只能编译出dll文件而没有lib因此无法静态链接
6、导出类的链接
静态库:不需要导出,可以直接链接
动态库:必需要导出才可以链接,必须将类中所有函数导出才可以使用(对于public)
对于(protected)无论导出或者不导出均无法直接使用
对于(private)无论导出或者不导出均无法直接使用
7、导出子类
静态库:不需要导出,直接使用文件头就可以使用
动态库:必须导出子类,
若仅使用到子类函数,可以不用导出父类。
若需要使用到父类中继承的函数时,需要将父类中相应的函数导出,否则无法使用
私有函数成员无法在外部使用
若类不导出,只导出成员函数,同样可以正常使用

工程B配置为lib,工程A  配置为exe; 把B中的lib文件包括B.lib全部包括进A的链接库中,不需要导出宏,编译才能通过;但是生成exe运行仍然提示缺dll,只能把过去的dll版文件全部拷到A的输出目录下

若工程B配置为dll,需要导出宏;把B.lib这一个库文件加到A的属性中,不需导入宏,不需拷到debug因为不运行,编译通过;但是无法运行提示缺少包括B.dll在内的所有A工程的dll文件,全部拷如A的输出目录,运行成功

这篇关于关于链接库的一些备忘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080107

相关文章

【C++】中动态链接库和静态链接库的区别

1. C++ 中动态链接库和静态链接库的区别 在C++编程中,动态链接库(Dynamic Link Library, DLL)和静态链接库(Static Library)都是用来组织和重用代码的方法,但它们之间有几个重要的区别: 1.1 动态链接库(DLL) 分离性:DLL是一个独立的文件,包含了可被多个程序共享的代码和数据。当程序运行时,它会从操作系统加载这个文件。 共享性:多个应用程

Vi操作备忘

Vi操作备忘       Vi是Linux系统里面的一个屏幕编辑程序,在终端中使用。Vi对文件的修改是在文件的副本上进行的,除非编辑顺利,并保存之后才会用修改的副本替代原始文件,否则,修改的内容会全部放弃,重新回到原始文件。       Vi是一个优秀的代码工程师所必备的技能。故在此简述vi备忘。 1、可以在终端上,输入以下形式的命令行,进入vi编辑程序:       vi filename

安卓13删除app 链接库警告弹窗Detected problems with app native

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码修改彩蛋 1.前言   有些客户的APP,打开首次会弹窗提示窗口, Detected problems with app native libraries (please consult log for detail):,需要删除这个窗口,避免挡住用户APP。而且这个提示有些app是以to

Java100:javaSE备忘

char c='\u4e00' //汉字开始 char c='\u9fa5'//汉字结束 java 正则   正则表达式:  java.util.regex.Pattern     [] 匹配的一个字符     [^a] 一个非a的字符     [^abcd]一个非a,b,c,d的字符     [A-Z] 一个 A-Z 的字符     [a-z] 一个a-z的字符     [0-9] 一个0

java99:java 基础备忘

程序 = 算法+数据结构     算法:解决问题的步骤      数据结构:将数据按照某种结构来保存     好的数据结构 => 好的算法 char 可以存储一个中文字符(1个char是两个字节,一个中文字符也是两个字节) && 短路 常用 三目运算 int a = 1; int b = 2; int c = a > b ? c =0101 : c = 1010 boolean ? 1:2

Mudo03 vscode配置相应的文件的搜索路径,库文件的搜索路径以及想要的链接库

使用muduo库,需要链接libmuduo_base.so、libmuduo_net.so 、libpthread.so VScode上如何配置相应的头文件的搜索路径?库文件的搜索路径? 文件的搜索路径:         -I:头文件搜索路径         -L:库文件搜索路径         -Imuduo_net :库名称 头文件和库文件搜索路径主要在.json文件中设置:

Docker在CentOS上硬盘使用被占满的问题(备忘)

摘录至 https://github.com/yeasy/docker_practice/blob/master/image/rm.md#centosrhel-的用户需要注意的事项 在CentOS上,遇到过这个问题。没有细究过。正好看到,记录之 内容如下: CentOS/RHEL 的用户需要注意的事项 在 Ubuntu/Debian 上有 UnionFS 可以使用,如 aufs 或者 o

RocketMQ安装、部署(备忘)

RocketMQ 这段时间接触了不少 MQ 产品,印象最为深刻的,当属 RocketMQ 个人认为其架构设计的十分合理 官方地址: https://github.com/apache/rocketmq 使用下来,最开始的安装、部署,遇到不少问题,因此特地备忘下 主要问题均来至 JDK 版本比官方的新 安装相关 官方文档: https://rocketmq.apache.org/doc

golang 编译期设置变量值(备忘)

说明 本文演示给程序打上时间戳,并输出 目录结构 fananchong@localhost:~/test$ tree.├── go.mod├── g.sh├── main.go└── version└── version.go main.go package mainimport ("fmt""os""test/version")func main() {args := o

VSCode 中画 UML 图(备忘)

vscode-drawio vscode-drawio 是一款 vscode 插件,支持在 vscode 中画流程图、思维导图、 UML 图 github 地址: https://github.com/hediet/vscode-drawio 安装 在 vscode 插件窗口内,搜索 vscode-drawio ,安装即可 使用 在 vscode 中打开 .drawio 扩展名的文件,