关于链接库的一些备忘

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

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

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

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

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

关于工程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的输出目录,运行成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值