美文网首页3D视觉工坊
VS中快速生成dll和lib方法

VS中快速生成dll和lib方法

作者: 3D视觉工坊 | 来源:发表于2019-03-23 21:45 被阅读243次

    原文首发于微信公众号【3D视觉工坊】,原文链接:传送门

    问题:如果我们在Visual Studio工程中,想要快速学习如何生成dll和lib,有什么小技巧呢?

    方法:在VS工程中添加新项目,操作具体方法如图1、图2所示。

    经过上述步骤,则可以生成一个新项目,新项目自动生成的文件如图3所示。

    对于其中的testDll-2.h文件,具体内容如下:

    *****testDll-2.h**start*****

    // 下列 ifdef 块是创建使从 DLL 导出更简单的
    // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 TESTDLL2_EXPORTS
     
    // 符号编译的。在使用此 DLL 的
    
    // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 
    // TESTDLL2_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
    
     // 符号视为是被导出的。
    
    #ifdef TESTDLL2_EXPORTS
    #define TESTDLL2_API __declspec(dllexport)
    # else
    #define TESTDLL2_API __declspec(dllimport)
    #endif
    
     // 此类是从 testDll-2.dll 导出的
    class TESTDLL2_API CtestDll2 {
    public: 
     CtestDll2(void);
     // TODO:  在此添加您的方法。
     }; 
    extern TESTDLL2_API int ntestDll2;
     
     TESTDLL2_API int fntestDll2(void);
    

    *****testDll-2.h**end*****

    对于testDll-2.cpp文件,具体内容如下:

    *****testDll-2.cpp**start*****

     // testDll-2.cpp : 定义 DLL 应用程序的导出函数。
    
    >#include "stdafx.h"
     
    >#include "testDll-2.h"
    
    // 这是导出变量的一个示例
    
    TESTDLL2_API int ntestDll2=0;
    
     // 这是导出函数的一个示例。
     
    TESTDLL2_API int fntestDll2(void)
     
    { 
         return 42;
     }
     
    // 这是已导出类的构造函数。
    
    // 有关类定义的信息,请参阅 testDll-2.h
     
    CtestDll2::CtestDll2()
     
     {
        return;
     }
    

    ****testDll-2.cpp****end****

    通过上述的示例demo,很容易能够理解对于类(class)、对于外部函数、变量如何进行操作,即可编译生成dll和lib。

    那么有时候,我们需要添加命名空间,又该如何操作呢?

    很简单,只需要在外围添加一个命名空间即可,其他不变,示例如下:

    *****testDll-2.h****start**namespace*****

    // 下列 ifdef 块是创建使从 DLL 导出更简单的
    
     // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 TESTDLL2_EXPORTS
    
    // 符号编译的。在使用此 DLL 的
     
     // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
     
     // TESTDLL2_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
    
    // 符号视为是被导出的。
    
    #ifdef TESTDLL2_EXPORTS
     
    #define TESTDLL2_API __declspec(dllexport)
    
    #else
    
    #define TESTDLL2_API __declspec(dllimport)
    
    #endif
    
    namespace testDLL2
    {
    
    // 此类是从 testDll-2.dll 导出的
     class TESTDLL2_API CtestDll2 {
     public:
     CtestDll2(void);
    // TODO:  在此添加您的方法。 
    };
    extern TESTDLL2_API int ntestDll2;
    TESTDLL2_API int fntestDll2(void);
     }
    

    *****testDll-2.h****end****namespace*****

    对于testDll-2.cpp,修改如下:

    *****testDll-2.cpp****start***namespace*****
    
    // testDll-2.cpp : 定义 DLL 应用程序的导出函数。
    #include "stdafx.h"
    #include "testDll-2.h"
    namespace testDLL2
     {
    // 这是导出变量的一个示例
    TESTDLL2_API int ntestDll2 = 0;
    // 这是导出函数的一个示例。
    TESTDLL2_API int fntestDll2(void)
    {
     return 42;
     }
     // 这是已导出类的构造函数。
    // 有关类定义的信息,请参阅 testDll-2.h 
    CtestDll2::CtestDll2()
      {
    return;
    }
     }
    

    *****testDll-2.cpp****end**namespace*****

    经过上述步骤即可以生成lib以及dll,那么如何调用上述生成的dll与lib呢?

    新建一个test工程,在「附加包含目录」包含进上述的.h文件所在的目录,附加库目录包含进上述的lib目录,dll文件放在工程的生成目录即可。

    在test工程中新建main.cpp文件:

    *****test**main.cpp*****

     // test.cpp : 定义控制台应用程序的入口点。
    #include "stdafx.h"
    #include "testDll2.h"
    #pragma comment(lib, "testDll2.lib")
    using namespace testDLL2;
    int main()
    {
     int val = 0;
    val = fntestDll(); 
      return 0;
    }
    

    *****test****main.cpp***end*****

    可能对于上述过程中,所使用的语法:

    > #pragma comment(lib, "testDll2.lib") 有些初学者会产生些疑问,这里给出我自己对于它的理解。

    对于C++中,如果要指定链接的库,比如我们要链接WSock32.lib的时候,我们当然可以不辞辛苦的将它加入到你的工程。但是我觉得更方便的方法是使用#pragma指示符,指定要链接的库。

    这个是题外话了,上述如有不足之处,欢迎留言多多批评指正。

    注:文章的最后,感谢欢哥对于写作本文给出的指点。

    上述内容,如有侵犯版权,请联系作者,会自行删文。

    荐读

    那些你所不知道的文献下载网址经验总结

    那些精贵的「机器视觉」学习资料总结

    回复关键词——知识星球,可前往星球

    image

    相关文章

      网友评论

        本文标题:VS中快速生成dll和lib方法

        本文链接:https://www.haomeiwen.com/subject/nljevqtx.html