代码之家  ›  专栏  ›  技术社区  ›  John M Gant aman_novice

如何在C++中“添加引用”

  •  14
  • John M Gant aman_novice  · 技术社区  · 15 年前

    我对C++很陌生,有些东西我完全不懂。在C中,如果我想使用外部库(例如log4net),我只需添加对log4net dll的引用,它的成员自动对我可用(并且在intellisense中)。如何在非托管C++中实现这一点?

    4 回复  |  直到 15 年前
        1
  •  24
  •   Stack Overflow is garbage    15 年前

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

    头文件包含在代码中,使您能够访问库中的类型和函数声明。

    .lib链接到应用程序中(项目属性->链接器->输入,其他依赖项)。

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

    如果没有.lib文件,则必须使用loadlibrary函数动态加载dll。

        2
  •  9
  •   ovanes    12 年前

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

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

    通常,一个DLL提供程序(如果您希望能够处理库)会向您提供一个头文件和一个.lib,其中包含对所需DLL的调用。一些供应商(例如boost)只要求您包含头文件,lib自动链接到可执行文件(可以通过compiler prorietary pragma指令实现)。如果不是这样的话,你必须进入C++项目的项目设置(Project Projials/SturialProvices /链接器/输入),并将LIB文件名输入到“附加依赖项”行中,例如 iced.lib iceutild.lib . 您也可以将完全限定的路径名放在那里。请注意,必须为两种配置(调试、发布)输入lib文件名。这是同样处理静态库和DLL的过程。唯一的区别是,dll需要一个dll-lib在应用程序目录或路径目录中。

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

    include file(s)用于包括在希望使用smth的位置。从解放军。只要包含它,编译器就会知道符号必须来自另一个(编译的)编译单元(编译的cpp文件=>对象文件)或.lib。如果找不到所需的符号,它将进行查找并通知您。

    祝你好运,
    奥凡内斯

    另一方面,这在一开始可能很难,但当你习惯了之后,就很容易了。

        3
  •  4
  •   Daniel Earwicker    15 年前

    C++在你感兴趣的意义上没有图书馆。它有你的头文件 #include 它有链接器处理的称为库的东西,其中包含编译后的代码。您需要将库(.lib文件)添加到链接器设置中。

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

        4
  •  0
  •   bobobobo    15 年前

    您需要做的第一件事是包括描述该库中可用功能的头文件。

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

    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放在应用程序可以找到它的地方。Charles Petzold说:

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

    我不建议使用“项目属性”菜单进行链接,因为链接到的库不太可见。

    See also