1.运行时库:Unix中一个典型的运行时库比方就是libc,它包含标准的C函数,如,print(),exit()等等,用户能创建他们自己的运行库(在Windows中是DLL),而详细的细节依托编译器和操作系统的。
2.静态库:函数和数据被编译进一个二进制文件(一般扩展名为.lib),静态库实践上是在链接时被链接到EXE的,库本身不需求与可施行文件一起发行。
3.动态库:用VC++创建的动态库包含两个文件,一个lib文件和一个dll文件,这个lib文件就是引入库,不是静态库,引入库有时也叫输入库或导入库。A8站源码交易平台
1 招认要运用的链接方法:1.应用程序的代码调用导出 DLL 函数时发生隐式链接。当调用可施行文件的源代码被编译或被汇编时,DLL 函数调用在方针代码中生成一个外部函数引用。若要解析此外部引用,应用程序有必要与 DLL 的创建者所供应的导入库(.LIB 文件)链接。
2.导入库仅包含加载 DLL 的代码和完毕 DLL 函数调用的代码。在导入库中找到外部函数后,会奉告链接器此函数的代码在DLL 中。要解析对 DLL 的外部引用,链接器只需向可施行文件中添加信息,奉告系统在进程主张时应在何处查找 DLL 代码。
3.系统主张包含动态链接引用的程序时,它运用程序的可施行文件中的信息定位所需的 DLL。假定系统无法定位 DLL,它将连续进程并闪现一个对话框来陈说过错。否则,系统将 DLL 模块映射到进程的地址空间中。
4.假定任何 DLL 具有(用于初始化代码和连续代码的)进口点函数,操作系统将调用此函数。在传递到进口点函数的参数中,有一个指定用以指示 DLL 正在附带到进程的代码。假定进口点函数没有回来 TRUE,系统将连续进程并陈说过错。究竟,系统修正进程的可施行代码以供应 DLL 函数的开始地址。
5.与程序代码的其余部分相同,DLL 代码在进程主张时映射到进程的地址空间中,且仅当需求时才加载到内存中。因此,由 .def 文件用来在 Windows 的前期版别中控制加载的 PRELOAD 和 LOADONCALL 代码特征不再具有任何意义。
A8站源码交易平台1.直到运行时,应用程序才知道需求加载的 DLL 的称谓。例如,应用程序或许需求从配置文件获取 DLL 的称谓和导出函数名。
2.假定在进程主张时未找到 DLL,操作系统将连续运用隐式链接的进程。同样是在此情况下,运用显式链接的进程则不会被连续,并能够查验从过错中恢复。例如,进程可奉告用户所发生的过错,并让用户指定 DLL 的其他途径。假定运用隐式链接的进程所链接到的 DLL 中有任何 DLL 具有失利的 DllMain 函数,该进程也会被连续。同样是在此情况下,运用显式链接的进程则不会被连续。
3.由于Windows 在应用程序加载时加载一切的 DLL,故隐式链接到许多 DLL 的应用程序主张起来会比较慢。为跋涉主张功用,应用程序可隐式链接到那些加载后当即需求的 DLL,并等到在需求时显式链接到其他 DLL。
4.显式链接下不需将应用程序与导入库链接。假定 DLL 中的更改导致导出序号更改,运用显式链接的应用程序不需从头链接(假定它们是用函数名而不是序号值调用 GetProcAddress),而运用隐式链接的应用程序有必要从头链接到新的导入库。
1.假定 DLL 具有 DllMain 进口点函数,则操作系统在调用 LoadLibrary 的线程上下文中调用此函数。假定由于早年调用了LoadLibrary 但没有相应地调用 FreeLibrary 函数而导致 DLL 现已附加到进程,则不会调用此进口点函数。假定 DLL 运用 DllMain 函数为进程的每个线程施行初始化,显式链接会构成问题,由于调用 LoadLibrary(或 AfxLoadLibrary)时存在的线程将不会初始化。
2.假定 DLL 将静态作用域数据声明为 __declspec(thread),则在显式链接时 DLL 会导致保护过错。用 LoadLibrary 加载 DLL 后,每当代码引用此数据时 DLL 就会导致保护过错。(静态作用域数据既包含全局静态项,也包含部分静态项。)因此,创建 DLL 时应避免运用线程本地存储区,或许应(在用户查验动态加载时)奉告 DLL 用户潜在的缺陷。
隐式链接:1.包含导出函数和/或 C++ 类的声明的头文件(.h 文件)。类、函数和数据均应具有 __declspec(dllimport),有关更多信息,请参见 dllexport, dllimport。
2.要链接的导入库(.LIB files)。(生成 DLL 时链接器创建导入库。)
3.实践的 DLL(.dll 文件)。
3 显式链接:1.调用 LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。
2.调用 GetProcAddress,以获取指向应用程序要调用的每个导出函数的函数指针。由于应用程序是通过指针调用 DLL 的函数,编译器不生成外部引用,故无需与导入库链接。
3.运用完 DLL 后调用 FreeLibrary。