我是C ++的新手,而且我完全没有得到的东西。在C#中,如果我想使用外部库,例如log4net,我只需添加对log4net DLL的引用,它的成员就可以自动使用(以及IntelliSense中)。我如何在非托管C ++中执行此操作?
答案 0 :(得分:24)
通常,库除了.dll之外还附带1)头文件(.h)和2).lib文件。
您的代码中的头文件是#include,以便您可以访问库中的类型和函数声明。
.lib链接到您的应用程序(项目属性 - >链接器 - >输入,其他依赖项)。
.lib文件通常包含简单的存根,可以自动加载dll和转发函数调用。
如果您没有.lib文件,则必须使用LoadLibrary函数动态加载DLL。
答案 1 :(得分:9)
基本概念如下: 有两种类型的库:static&动态。它们之间的区别在于链接构建步骤中的静态库将它们的编译代码嵌入到可执行文件(或dll)中;动态库只是嵌入指向函数的指针和一个指令,当程序加载时应该加载一些dll。这是由链接器为您实现的。
现在您可以决定要使用哪两个。 DLL具有许多优点和缺点。如果开发一个庞大的应用程序,可能值得考虑使用延迟加载的DLL而不是静态库。有些库只是作为DLL交付给你,你别无选择。无论如何,初学者最简单的方法是使用静态库。这将使您的部署和测试变得更加容易,因为在处理DLL时您必须确保在运行时找到它们(即使使用调试器),这涉及复制一个目录中的所有内容或处理路径变量。
通常,DLL提供程序(如果您打算应该能够处理该库)会为您提供一个头文件和一个包含对所需DLL的调用的.lib。某些供应商(例如boost)只要求您包含头文件,并且lib会自动链接到您的可执行文件(可以通过编译器prorietary pragma指令实现)。如果不是这种情况,则必须进入C ++项目的项目设置(项目属性/配置属性/链接器/输入),并将lib文件名输入“附加依赖关系”行,例如iced.lib iceutild.lib
。您还可以在其中放置完全限定的路径名。请注意,您必须输入两个配置的lib文件名(Debug,Release)。这是您使用静态库和Dll同样执行的过程。 DLL的唯一区别是DLL lib要么位于app目录中,要么位于其中一个路径目录中。
在该步骤之后,如果您尝试链接不兼容的库,仍可能会出现编译器错误。原因很多,为什么它们可能不兼容。但是尝试首先以这种方式链接lib并查看是否有效。如果没有,请在此处再次发布您的错误;)
包含文件曾经被包含在您想要使用smth的地方。来自lib。只需包含它,编译器就会知道符号必须来自另一个(编译的)编译单元(编译的cpp-file =>目标文件)或.lib。如果找不到所需的符号,它会查找并通知您。
祝你好运,P.S。这可能在开始时很难,但是当你习惯它时,它会很容易。
答案 2 :(得分:4)
C ++没有你想到的意义上的库。它有你#include
的头文件,它有链接器处理的库,它包含已编译的代码。您需要将库(.LIB文件)添加到链接器设置。
在Windows上,如果您正在使用DLL,理想情况下,您应该有一个.LIB文件与它一起使用,称为DLL的导入库,并将该.LIB文件添加到链接器设置。
答案 3 :(得分:0)
您需要做的第一件事是#include描述该库中可用功能的头文件。
该库的实际代码将位于以下两个位置之一:
根据库的代码提供方式(如.lib文件或.dll),您必须:
有时一个软件包附带了一个你需要链接的.lib文件和一个.dll文件。在这种情况下,您不需要调用LoadLibrary,您只需要#pragma comment(lib,“libaryfile.lib”),因为在这种情况下.lib将您链接到.dll。
一个非常重要的细节是将DLL放在应用程序可以找到它的位置。 Charles Petzold说:
当Windows需要在运行需要它的程序之前加载DLL模块时,库文件必须存储在包含.EXE程序,当前目录,Windows系统目录,Windows目录或可通过MS-DOS环境中的PATH字符串。 (按顺序搜索目录。) Programming windows, 5th ed MSDN
我不建议使用项目属性菜单进行链接,因为它与您链接的库不同。