【发布时间】:2011-12-12 08:27:06
【问题描述】:
如何在 Visual Studio 2010 中添加.dll?我只是找不到那里的选项。
【问题讨论】:
标签: c++ visual-studio
如何在 Visual Studio 2010 中添加.dll?我只是找不到那里的选项。
【问题讨论】:
标签: c++ visual-studio
假设您要编译的源文件是 main.cpp 以及您的 example_dll.dll 和 example_dll.lib 。现在运行cl.exe main.cpp /EHsc /link example_dll.lib
现在你可能会得到 main.exe
【讨论】:
我发现了解底层工具很有用。它们是 cl.exe(编译器)和 link.exe(链接器)。您需要告诉编译器要在动态库中调用的函数的签名(通过包含库的头文件),并且您需要告诉链接器调用库的内容以及如何调用它(通过包含“imlib”或导入库)。
这与 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。
【讨论】:
在 Windows 上,您不能直接链接到 .dll 文件 - 您必须改用随附的 .lib 文件。为此,请转到 Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies 并将路径添加到您的 .lib 作为下一行。
您还必须确保.dll 文件位于%PATH% 环境变量所包含的目录中或其副本位于Output Directory 中(默认情况下,这是@ 987654329@ 在您的项目文件夹下)。
如果您无权访问.lib 文件,另一种方法是在运行时使用LoadLibrary 和GetProcAddress 等WINAPI 函数手动加载.dll。
【讨论】:
您不直接添加或链接到 DLL,而是链接到 DLL 生成的 LIB。
LIB 提供符号和其他必要数据以在代码中包含库(静态链接)或引用 DLL(动态链接)。
要链接到 LIB,您需要将其添加到项目属性 -> 链接器 -> 输入 -> 附加依赖项列表中。这里的所有 LIB 文件都将用于链接。你也可以像这样使用编译指示:
#pragma comment(lib, "dll.lib")
使用静态链接,代码包含在您的可执行文件中,并且没有运行时依赖项。动态链接需要在 the search path 中提供具有匹配名称和符号的 DLL(不仅仅是路径或系统目录)。
【讨论】: