如何在Visual Studio 2010中添加.dll
?我在那里找不到选项。
答案 0 :(得分:45)
在Windows上,您不直接与.dll
文件链接 - 您必须使用随附的.lib
文件。为此,请转到Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies
并添加.lib的路径作为下一行。
您还必须确保.dll
文件位于%PATH%
环境变量所包含的目录中,或者其副本位于Output Directory
中(默认情况下,这是项目文件夹下的Debug\Release
。
如果您无权访问.lib
文件,则可以使用WINAPI函数(例如LoadLibrary和GetProcAddress)在运行时手动加载.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