【问题标题】:How to "add reference" in C++如何在 C++ 中“添加引用”
【发布时间】:2009-07-14 19:24:34
【问题描述】:

我是 C++ 新手,有些东西我完全不明白。在 C# 中,如果我想使用外部库,例如 log4net,我只需添加对 log4net DLL 的引用,它的成员就会自动可供我使用(并且在 IntelliSense 中)。我如何在非托管 C++ 中做到这一点?

【问题讨论】:

    标签: c++ visual-studio dll


    【解决方案1】:

    除了 .dll 之外,该库通常还附带 1) 一个头文件 (.h) 和 2) 一个 .lib 文件。

    头文件在您的代码中被#include'ed,以便您访问库中的类型和函数声明。

    .lib 链接到您的应用程序(项目属性 -> 链接器 -> 输入,附加依赖项)。

    .lib 文件通常包含自动加载 dll 并将函数调用转发给它的简单存根。

    如果您没有 .lib 文件,则必须使用 LoadLibrary 函数来动态加载 DLL。

    【讨论】:

    • 比我的回答更彻底。我还要补充一点,如果您使用的是 LoadLibrary,那么您不能简单地按名称调用函数。你需要做后期绑定。
    • 我发现我又不完整了。 LoadLibrary 返回一个句柄,您可以将其传递给 GetProcAddress,它为您提供一个真正的指针。您也可以选择调用 FreeLibrary 来卸载它。 (我继续删除了我原来的答案。)
    • @Steven:没错,我认为如果他确实需要使用 LoadLibrary,我会给他一个起点,而不会陷入(许多)坚韧不拔的细节中。
    【解决方案2】:

    基本概念如下: 有两种类型的库:静态库和动态库。它们之间的区别在于,静态库在链接构建步骤中,将它们的编译代码嵌入到您的可执行文件(或 dll)中;动态库只是嵌入指向函数和指令的指针,当程序将要加载时,应该加载一些 dll。这是由链接器为您实现的。

    现在您可以决定要使用这两个中的哪一个。 DLL 有许多优点和缺点。如果开发一个巨大的应用程序,可能值得考虑使用延迟加载的 DLL 而不是静态库。有些库只是作为 DLL 提供给您,您别无选择。无论如何,初学者最简单的方法是使用静态库。这将使您的部署和测试更加容易,因为在处理 DLL 时,您必须确保在运行时找到它们(即使在使用调试器时),这涉及到将所有内容复制到一个目录中或处理路径变量。

    通常,DLL 提供程序(如果您希望您能够处理该库)会为您提供一个头文件和一个 .lib,其中包含对所需 DLL 的调用。一些供应商(例如 boost)只要求您包含头文件,并且 lib 会自动链接到您的可执行文件(可以通过编译器专有的 pragma 指令来实现)。如果不是这种情况,您必须进入 C++ 项目的项目设置(项目属性/配置属性/链接器/输入)并在“附加依赖项”行中输入 lib 文件名,例如iced.lib; iceutild.lib。您还可以将完全限定的路径名​​放在那里。请注意,您必须为两种配置(调试、发布)输入 lib 文件名。这是您对静态库和 Dll 执行的程序。 DLL 要求 DLL 库位于您的应用程序目录或其中一个路径目录中的唯一区别。

    在这一步之后,如果您尝试链接不兼容的库,您仍然可能会遇到编译器错误。有很多原因,为什么它们可能不兼容。但是尝试首先以这种方式链接库,看看是否有效。如果没有,请在此处再次发布您的错误;)

    包含文件曾经被包含在您想使用的地方。从库。只需包含它,编译器就会知道符号必须来自另一个(已编译的)编译单元(已编译的 cpp-file=> 目标文件)或 .lib。如果找不到所需的符号,它将进行查找并通知您。

    祝你好运, 风向标

    附:刚开始这可能很难,但是当你习惯它时,它会很容易。

    【讨论】:

      【解决方案3】:

      C++ 没有您所想的那种库。它有你#include 的头文件,它有链接器处理的称为库的东西,其中包含已编译的代码。您需要将库(.LIB 文件)添加到链接器设置中。

      在 Windows 上,如果您使用的是 DLL,理想情况下,您应该有一个 .LIB 文件,该文件称为 DLL 的导入库,然后将该 .LIB 文件添加到您的链接器设置中。

      【讨论】:

        【解决方案4】:

        您需要做的第一件事是#include 描述该库中可用函数的头文件。

        库的实际代码将位于以下两个位置之一:

        1. 静态库 (.lib)
        2. 一个 dll (.dll)

        根据向您提供库代码的方式(作为 .lib 文件或作为 .dll),您必须:

        • #pragma comment(lib, "libraryname.lib" ) 如果是 .lib
        • LoadLibrary 如果是.dll

        有时,一个软件包会同时附带一个您需要链接到的 .lib 文件和一个 .dll 文件。在这种情况下,您不需要调用 LoadLibrary,您只需要 #pragma comment(lib, "libaryfile.lib"),因为在这种情况下,.lib 会将您链接到 .dll。

        一个非常重要的细节是将 DLL 放在您的应用程序可以找到的地方。查尔斯·佩佐德 说:

        当 Windows 需要在运行需要它的程序之前加载 DLL 模块时,库文件必须存储在包含 .EXE 程序的目录、当前目录、Windows 系统目录、Windows 目录或可通过MS-DOS 环境中的 PATH 字符串。 (按该顺序搜索目录。) Programming windows, 5th ed MSDN

        我不建议使用项目属性菜单进行链接,因为您链接到的库不那么明显。

        See also

        【讨论】:

        • 这不能回答问题。
        • 这确实回答了这个问题,但不正确。正如 jalf 指出的那样,您通常与导入库链接(使用编译指示或以其他方式将其添加到 lib.exe 结束的命令行)。使用 LoadLibrary 是后期绑定的替代方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多