visual studio 2015 c++;将独立dll文件添加到项目中 所以我正在为C++编写一些库,让初学者的经验更容易。我已经将这些库放入一个独立的dll中,现在我想将其添加到另一个项目中。但问题是在互联网上搜索了很久之后,我必须有include目录和其他东西,但我只想在项目中包含一个dll文件,这样项目就可以访问其中的.h和.cpp文件。IK我可以用java添加外部jar然后我可以访问其中的库但是我如何在Visual Studio 2015中用C++来做呢?< /P> < p>你如何像java一样做它?嗯,你没有

visual studio 2015 c++;将独立dll文件添加到项目中 所以我正在为C++编写一些库,让初学者的经验更容易。我已经将这些库放入一个独立的dll中,现在我想将其添加到另一个项目中。但问题是在互联网上搜索了很久之后,我必须有include目录和其他东西,但我只想在项目中包含一个dll文件,这样项目就可以访问其中的.h和.cpp文件。IK我可以用java添加外部jar然后我可以访问其中的库但是我如何在Visual Studio 2015中用C++来做呢?< /P> < p>你如何像java一样做它?嗯,你没有,c++,visual-studio,dll,visual-studio-2015,dllimport,C++,Visual Studio,Dll,Visual Studio 2015,Dllimport,需要一个头向编译器提供从DLL导出的函数和其他符号的原型,这些函数和符号可能是您想要使用的。您甚至可能有多个头文件来逻辑划分DLL的代码。由于您不想在源代码中硬编码这些头文件的路径,因此您需要在编译器/构建选项中指定其包含目录的路径,从而使您可以使用相对路径 通常还需要一个LIB文件,尽管这稍微灵活一些。一般来说,LIB使事情变得容易得多。它将在编译DLL时由链接器生成,并且它包含有存根,便于链接到该DLL导出的函数。在构建使用DLL的应用程序时,您可以在链接器选项中指定此LIB文件,一切正常。

需要一个头向编译器提供从DLL导出的函数和其他符号的原型,这些函数和符号可能是您想要使用的。您甚至可能有多个头文件来逻辑划分DLL的代码。由于您不想在源代码中硬编码这些头文件的路径,因此您需要在编译器/构建选项中指定其包含目录的路径,从而使您可以使用相对路径

通常还需要一个LIB文件,尽管这稍微灵活一些。一般来说,LIB使事情变得容易得多。它将在编译DLL时由链接器生成,并且它包含有存根,便于链接到该DLL导出的函数。在构建使用DLL的应用程序时,您可以在链接器选项中指定此LIB文件,一切正常。这称为隐式动态链接。它是动态链接,因为您正在使用DLL,但它是隐式的,因为链接器正在为您处理脏工作

如果不想使用LIB文件,则需要执行显式动态链接。这仍然是动态链接,因为您仍然在使用DLL,但它是显式的,因为您必须显式编写代码来加载DLL模块并获取指向它导出的函数的指针。微软的构建工具提供了各种特性,使之变得更简单,但它比使用LIB文件更困难,除非我有充分的理由否则,否则我将推荐。

< P>这不是C++如何工作的(我也假设你不是在谈论C++或CX或MC++),严格说来不是C++)

< C++语言没有定义一个“应用程序二进制接口”——一个允许二进制文件之间连接的ABI。这是一个实施问题

有支持C++的AbI,如COM和CORBA,最新的是基于COM.</P>的WRIT-本身。 C++不同于Java和C等语言,后者要求运行时具有ABI:Java有其
.class
.jar
文件,而.NET/C#在其程序集中包含其CLR元数据(
.dll
文件-与“真实”dll文件不同)

请注意,C#编译器生成的DLL文件与C/C++编译器工具链的链接器生成的DLL文件完全不同——虽然它们与PE(可移植可执行文件)文件共享一种共同的外部格式,但在内部却完全不同:CLR DLL包含中间字节码CIL,而“真实”DLL包含本机字节码,处理器特定指令

<> P>在C++中使用其他库的一般方法是在源窗体中使用它们(如<代码> .c/c>和<代码> .CPP 文件,在项目中包含),或者作为<代码> .h <代码>头文件,具有<代码> .LIB < /C>(静态库),它们几乎与可重用二进制文件相似,除非它们被链接(“编译成”和“合并”)。转换为已完成的二进制文件,并且无法在运行时替换

另一种方法是动态链接,它要求运行时(即Win32)为您运行运行时链接,通常使用“代码> GETPROCENTA//CODEX>”但这只导出C样式函数,而不是完整对象和类(当然也不是任何C++模板)。 总之:

  • 您有一个DLL,并且希望在其中使用代码:
    • 它是WinRT DLL吗?
        如果你想使用纯C++,那么你需要使用WTL…李> 否则,如果你可以用C++ + CX,那么你可以在VisualStudio中使用“添加引用”UI,但是要注意,你不再写“真实”的C++了。
    • 它是一个COM库吗?
      • (请注意,您需要ATL(活动模板库)和其中包含的类型的IDL定义,这是与头文件等效的COM)。您还可以使用
        #import
        和/或使用IDE生成调用COM所需的实际
        .h
        .c
        文件,而无需太多麻烦。但是,如果在以后的COM DLL版本中更改了太多内容(请参阅“DLL地狱”),而不重新生成程序,则会遇到问题
    • 否则它是传统的本机Win32 PE DLL吗?
      • PE可执行文件的全部内容是导出函数的列表及其在DLL中的地址位置
      • 您想要静态链接还是动态链接?
        • 对于动态链接,您想要运行时解析(痛苦但灵活)还是“自动”链接?
          • 对于运行时链接,您只需要
            .dll
            文件和
            .h
            文件。对于要调用的每个函数,您需要自己手动调用
            GetProcAddress
            ,然后调用它。一个优点是,您可以在运行时检测函数是否存在,并优雅地处理链接错误
          • 对于自动链接,除了
            .dll
            .h
            文件外,还将为您提供一个
            .lib
            文件,
            .lib
            文件是一个静态链接的小型库,其中包含存根和其他代码,这些代码需要为您执行运行时链接,而无需手动调用
            GetProcAddress
        • 对于静态链接,您没有
          .dll
          文件,而是
          .lib
          文件:称为“静态库”。