【问题标题】:Linking dll in Visual Studio在 Visual Studio 中链接 dll
【发布时间】:2011-12-12 08:27:06
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-studio


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        如果您无权访问.lib 文件,另一种方法是在运行时使用LoadLibraryGetProcAddress 等WINAPI 函数手动加载.dll

        【讨论】:

        • 我也见过他们提到 .h 文件的地方。我们在这个过程中需要它们吗?我认为不需要它们,因为 .lib 文件包含 dll 的所有信息。
        • @darkgaze 我认为仍然需要它们,因为 .h 文件通常包含所有原型、声明、常量、宏等。
        【解决方案4】:

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

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

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

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

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

        【讨论】:

        • 关于静态链接:如何让 Visual Studio 将 dll 从某个目录复制到构建(或链接)时的输出?
        • @Marcel 每个项目都提供预构建、构建后和各种其他步骤(检查项目设置)。您可以在那里进行文件复制,甚至运行整个脚本(我设置了一个脚本来从 git 修订 ID 创建标题并在预构建中增加内部版本号,然后将文件复制到后期的测试安装)。
        猜你喜欢
        • 2011-06-06
        • 2016-10-18
        • 2011-09-28
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 2017-11-27
        • 2014-09-06
        相关资源
        最近更新 更多