1.静态库:
我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
Linux下的静态库为lib*.a格式的二进制文件(目标文件),对应于Windows下的.lib格式的文件。
问题:
只给出头文件和obj文件能否编译成功?
测试:只用.h和obj文件进行测试
会报错链接错误,找不到实现
需将obj添加至工程(链接-->输入-->附加依赖项)
这样就能使用.h和 .obj
注意:c语言使用要添加extern "C"关键字。
__cplusplus -- 编译器提供的宏,如果是cpp文件,则宏会被定义,如果是c文件,则此宏不会被定义
同时兼容c和c++语法的头文件:
#ifdef __cplusplus extern "C" { #endif int Sub(int nVal1, int nVal2); #ifdef __cplusplus } #endif // __cplusplus
工程里的obj太多怎么办?
我们需要引入静态库技术,即(所有obj合成一个文件,文件后缀.lib)
静态库创建:
创建windos桌面向导->静态库工程
然后放进去,重新生成解决方案,得到lib.lib静态库
使用静态库:
将头文件.h和.lib文件放入新文件再同时再添加.lib.
静态库优缺点:
2.动态库
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。
库代码在exe运行时加载进去
为什么要使用动态库?
当动态库内容需要更新时,只需更新dll文件就可对啊a,b,c文件全部更新,更具有灵活性。
如何制作动态库:
桌面 向导->dll->将.h. cpp 放入 __declspec(dllexport) -- 指出dll中需要导出的函数、变量、类。
如何使用dll
1)头文件+.lib 拷过去
2)lib添加到工程中(同前面)
或者 添加头文件#pragma comment(lib,"dll.lib")
添加以下内容:
__declspec(dllexport) -- 指出dll中需要导出的函数、变量、类
__declspec(dllimport) --指出导入
或者:我们直接用宏兼容两种创建一个common.h
#pragma once #ifdef DLL_EXPORT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif //
添加:
#ifdef __cplusplus extern "C" { #endif DLL_API int Add(int nVal1, int nVal2); DLL_API extern int g_nTest; #ifdef __cplusplus } #endif // __cplusplus
3)在预处理选项添加DLL_EXPORT
4). dll需放在.exe文件下(若不在会报以下错误)
dll.lib作用:告诉连接器,某些接口实现在某个dll中,在链接阶段不用去实现,其
实现会在exe启动时候加载到进程中