在Visual Studio中链接dll

时间:2011-10-21 06:47:45

标签: c++ visual-studio

如何在Visual Studio 2010中添加.dll?我在那里找不到选项。

4 个答案:

答案 0 :(得分:45)

在Windows上,您不直接与.dll文件链接 - 您必须使用随附的.lib文件。为此,请转到Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies并添加.lib的路径作为下一行。

您还必须确保.dll文件位于%PATH%环境变量所包含的目录中,或者其副本位于Output Directory中(默认情况下,这是项目文件夹下的Debug\Release

如果您无权访问.lib文件,则可以使用WINAPI函数(例如LoadLibraryGetProcAddress)在运行时手动加载.dll

答案 1 :(得分:23)

您不直接针对DLL添加或链接,而是链接DLL生成的LIB。

LIB提供符号和其他必要数据,以便在代码中包含库(静态链接)或引用DLL(动态链接)。

要链接LIB,您需要将其添加到项目属性 - >链接器 - >输入 - >附加依赖项列表。此处的所有LIB文件都将用于链接。你也可以像这样使用一个pragma:

#pragma comment(lib, "dll.lib")

使用静态链接,代码包含在您的可执行文件中,并且没有运行时依赖项。动态链接需要具有匹配名称的DLL和the search path内的符号(只是路径或系统目录)。

答案 2 :(得分:3)

我发现了解基础工具很有用。它们是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

第一行生成A.obj,第二行生成A.exe。 /c标志告诉cl不要链接,/EHsc指定应使用哪种C ++异常处理二进制文件(没有默认值,因此您必须指定一些东西)。

如果您未指定/c,cl将为您呼叫link。您可以使用/link标志为link指定其他参数,并根据需要立即执行所有操作:

cl A.cpp /EHsc /link B.lib

如果B.lib不在INCLUDE路径上,则可以给它一个相对路径或绝对路径,或者使用/I标志将其父目录添加到包含路径中。

如果您是从cygwin打电话(就像我一样),请用破折号替换正斜杠。

如果在A.cpp中编写#pragma comment(lib, "B.lib"),则只是告诉编译器在A.obj中留下注释,告诉链接器链接到B.lib。等效于在链接命令行上指定B.lib。

答案 3 :(得分:0)

假设您要编译的源文件是main.cpp以及example_dll.dll和example_dll.lib。现在运行cl.exe main.cpp /EHsc /link example_dll.lib 现在您可能会得到main.exe