在Visual Studio中链接dll

sma*_*llB 34 c++ visual-studio

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

gwi*_*rrr 52

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

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

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


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 搜索路径(这是不是只是路径或系统目录).

  • 关于静态链接:如何使Visual Studio将dll从某个目录复制到构建(或链接)上的输出? (3认同)
  • @Marcel每个项目都提供预构建,后期构建和各种其他步骤(检查项目设置).你可以在那里做一个文件拷贝,甚至可以运行一个完整的脚本(我有一个脚本设置来从git版本ID创建一个头,并在预构建中增加内部版本号,然后将文件复制到post中的测试安装). (3认同)

cmc*_*cmc 6

我发现了解底层工具很有用。它们是 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++ 异常处理(没有默认值,因此您必须指定某些内容)。

如果您不指定/ccl 会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。