gwi*_*rrr 52
在Windows上,您不.dll
直接链接文件 - 您必须使用附带的.lib
文件.为此,请转到Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies
并添加.lib的路径作为下一行.
您还必须确保该.dll
文件位于%PATH%
环境变量包含的目录中,或者其副本位于Output Directory
(默认情况下,它位于 Debug\Release
项目的文件夹下).
如果您无权访问该.lib
文件,则可以.dll
使用WINLI函数(如LoadLibrary和GetProcAddress)在运行时手动加载.
ssu*_*ube 26
您不直接添加或链接DLL,您链接DLL生成的LIB.
LIB提供符号和其他必要数据,以在代码中包含库(静态链接)或引用DLL(动态链接).
要链接LIB,您需要将其添加到项目Properties - > Linker - > Input - > Additional Dependencies列表中.此处的所有LIB文件都将用于链接.你也可以像这样使用pragma:
#pragma comment(lib, "dll.lib")
Run Code Online (Sandbox Code Playgroud)
使用静态链接,代码包含在您的可执行文件中,并且没有运行时依赖项.动态链接需要相匹配的名称和符号中提供一个DLL 搜索路径(这是不是只是路径或系统目录).
我发现了解底层工具很有用。它们是 cl.exe(编译器)和 link.exe(链接器)。您需要告诉编译器您要在动态库中调用的函数的签名(通过包含库的头文件),并且您需要告诉链接器该库的名称以及如何调用它(通过包含“implib”或导入库)。
这与 gcc 用于链接到 *nix 上的动态库的过程大致相同,只是库对象文件不同。
了解底层工具意味着您可以更快地在 IDE 中找到合适的设置,并允许您检查生成的命令行是否正确。
说 A.exe 依赖 B.dll。您需要在 A.cpp ( #include "B.h"
) 中包含 B 的头文件,然后编译并与 B.lib 链接:
cl A.cpp /c /EHsc
link A.obj B.lib
Run Code Online (Sandbox Code Playgroud)
第一行生成 A.obj,第二行生成 A.exe。该/c
标志告诉 cl 不要链接并/EHsc
指定二进制文件应使用哪种 C++ 异常处理(没有默认值,因此您必须指定某些内容)。
如果您不指定/c
cl 会link
为您打电话。如果您愿意,您可以使用该/link
标志来指定其他参数link
并一次性完成所有操作:
cl A.cpp /EHsc /link B.lib
Run Code Online (Sandbox Code Playgroud)
如果 B.lib 不在INCLUDE
路径上,您可以为其提供相对或绝对路径,或者使用/I
标志将其父目录添加到包含路径中。
如果你从 cygwin 调用(就像我一样)用破折号替换正斜杠。
如果你用#pragma comment(lib, "B.lib")
A.cpp编写,你只是告诉编译器在 A.obj 中留下注释,告诉链接器链接到 B.lib。它相当于在链接命令行上指定 B.lib。