【发布时间】:2009-07-14 19:24:34
【问题描述】:
我是 C++ 新手,有些东西我完全不明白。在 C# 中,如果我想使用外部库,例如 log4net,我只需添加对 log4net DLL 的引用,它的成员就会自动可供我使用(并且在 IntelliSense 中)。我如何在非托管 C++ 中做到这一点?
【问题讨论】:
标签: c++ visual-studio dll
我是 C++ 新手,有些东西我完全不明白。在 C# 中,如果我想使用外部库,例如 log4net,我只需添加对 log4net DLL 的引用,它的成员就会自动可供我使用(并且在 IntelliSense 中)。我如何在非托管 C++ 中做到这一点?
【问题讨论】:
标签: c++ visual-studio dll
除了 .dll 之外,该库通常还附带 1) 一个头文件 (.h) 和 2) 一个 .lib 文件。
头文件在您的代码中被#include'ed,以便您访问库中的类型和函数声明。
.lib 链接到您的应用程序(项目属性 -> 链接器 -> 输入,附加依赖项)。
.lib 文件通常包含自动加载 dll 并将函数调用转发给它的简单存根。
如果您没有 .lib 文件,则必须使用 LoadLibrary 函数来动态加载 DLL。
【讨论】:
基本概念如下: 有两种类型的库:静态库和动态库。它们之间的区别在于,静态库在链接构建步骤中,将它们的编译代码嵌入到您的可执行文件(或 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。如果找不到所需的符号,它将进行查找并通知您。
祝你好运, 风向标
附:刚开始这可能很难,但是当你习惯它时,它会很容易。
【讨论】:
C++ 没有您所想的那种库。它有你#include 的头文件,它有链接器处理的称为库的东西,其中包含已编译的代码。您需要将库(.LIB 文件)添加到链接器设置中。
在 Windows 上,如果您使用的是 DLL,理想情况下,您应该有一个 .LIB 文件,该文件称为 DLL 的导入库,然后将该 .LIB 文件添加到您的链接器设置中。
【讨论】:
您需要做的第一件事是#include 描述该库中可用函数的头文件。
库的实际代码将位于以下两个位置之一:
根据向您提供库代码的方式(作为 .lib 文件或作为 .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
我不建议使用项目属性菜单进行链接,因为您链接到的库不那么明显。
【讨论】: