Table of Contents

在Windows上编译库


静态链接

导出函数,得到lib文件,在需要调用的工程中设置引用,编译程序运行的时候不再需要任何依赖。
步骤和下面动态链接库的步骤类似。

动态链接

ps:动态链接的程序内容都在dll文件中,运行时需要dll文件,但是作为开发者,编译的时候还需要lib文件作为“索引”进行链接。C++的函数可以直接导出,C++再引用的时候也会有名称赘裰所以可以用,但是也可以导出为C格式增加拓展性,比如可以更方便地拿给Python调用。

Windows DLL编译的时候可以有main函数,不影响
Windows DLL编译的时候不一定需要DllMain函数

构建步骤

  1. 在VS中建立工程(DLL类型)
  2. 建立自己的头文件和源文件
  3. 要导出的函数声明前面要使用一个导出的符号__declspec(dllexport)
  4. 源文件中要引用pch.h(这个头文件只能在源文件中引用)
  5. 编译,如果没有导出任何函数,就不会生成lib文件

使用步骤

  1. 在VS中建立工程
  2. 设置好头文件引用和库链接,头文件确保和库编译时一致
  3. 调用头文件中存在,且在DLL中导出的函数
  4. 编译
  5. 运行的时候需要DLL文件在同一个目录下

添加链接的头文件的方式见VS使用技巧

多个DLL文件的依赖关系 0.首先DLL和DLL之间肯定也是可以有依赖关系的,就像C++程序的Runtime就是DLL的形式。系统的自带的库,放在Lib_Path的DLL,就不需要考虑路径的问题,肯定能加载到;自己编译的库,当有依赖关系的时候,所有DLL都要能加载到才行。

  1. 如果是C/C++加载DLL,因为不能指定路径,所以把所有的DLL都放在可执行文件的目录下就行。
  2. 如果是Python加载,因为可以指定Path,所以DLL可以放在不同目录,但是当DLL之间有依赖关系的时候,就需要注意了:Load.py加载A.dll,A.dll依赖于B.dll,A.dll的路径可以指定,但是B.dll必须和Load.py在相同的路径下,也就是在程序运行路径下。

可以使用工具查看exe/dll依赖的dll有哪些,检查少了哪些文件