zoukankan      html  css  js  c++  java
  • [转]windows下VS2010中lib与dll文件的生成与使用

    原文地址:https://my.oschina.net/SysuHuyh5LoveHqq/blog/644622

    近期在windows下开发了某个程序,需要将其生成静态文件(lib)以及动态库文件(dll),其中参考了不少帖子,有的讲得也不是很清楚明白,先将本人实践过的记录一下,供后期自己查询,也供各位大牛点评。

    一、lib文件的生成与使用

    1、lib的生成

    相对来说,静态库文件还是比较容易生成和使用的,在代码上,貌似也不需要更改什么,举例说明:

    头文件函数声明形式如下:

    extern bool Uninitialize();

    在VS2010项目中,“新建->项目->Win32项目->静态库”,配置好相应的项目属性即可。

    其中大致包括(根据个人项目需要去配置,如何配置可参考网上其他帖子,比较多): 

    “配置属性->常规->字符集->(选你需要的字符集)”

    “VC++目录->包含目录”

    “VC++目录->库目录”

    项目生成之后,会在项目目录中生成相应的lib文件,这个lib文件就是真正的静态库文件。(与dll生成中产生的lib文件还是不同的,这在dll生成的时候需要特别注意一下)

    2、 lib文件使用,无需过多配置,只需要在“VC++目录->库目录”引入需要的lib文件即可

    二、dll文件的生成与使用

    1、dll的生成

    动态库文件dll的生成就没有那么简单了,稍微需要修改一点源码(相比起来,还是比较喜欢Linux下so文件生成的方式,完全不需要更改源码,编译命令修改即可)

    同样举例说明,windows下源码例子 ,同样对于Uniitialize函数,我们需要添加dll导出宏定于在函数声明处:

    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec(dllexport)
    #else
    #define EXPORT __declspec(dllexport)
    #endif
    //.h文件函数声明
    EXPORT extern bool Uninitialize();
    //.cpp文件函数实现
    EXPORT bool Uninitialize()
    {
    }

    同样在VS2010项目属性中,“新建->项目->Win32项目->DLL”,我们也需要设置项目属性,这与静态库基本类似,依赖的lib文件可在“链接器->输入”中设置。

    项目生成之后,会在项目目录中生成相应的dll文件以及一个lib文件,注意,此处的lib文件并非静态库文件,而是dll文件的相应函数导入库文件。

    2、dll的使用

    dll使用有两种方式,一个是隐式使用,一种是显示使用,这里我只讲讲我自己试验过的隐式使用方式,因为此种方式不需要我demo程序中调用接口时更改接口的使用方式(即不需要LoadLibrary以及GetProcAddress等等),关于显示调用dll接口的方法,大家可参考网上其他很多帖子说明

    // .h文件,函数声明还是需要导出
    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec(dllexport)
    #else
    #define EXPORT __declspec(dllexport)
    #endif
    
    EXPORT extern bool Uninitialize();

    如上隐式使用dll时,对于接口的头文件,我们还是需要导出宏定义

    注意:配置项目属性的时候,生成dll时产生的对应lib文件(即dll的函数导入库文件)是需要“VC++目录->库目录”引入的,同时将dll文件放在项目目录exe对应的文件夹下即可

    另外的解释:

    https://segmentfault.com/q/1010000000431206

    问:我现在有个DLL项目,但是仅仅生成DLL文件,我还想要生成一个LIB文件,应该怎么办呢? 就是在这个DLL项目下,同时得到DLL和LIB,不需要另外新建一个静态链接库工程。

    答:在你的项目里需要至少有一个export symbollinker才会为你创建.lib文件。

    你可以在你想要导出的符号前面加上__declspec(dllexport),告诉linker你需要导出某个符号(函数,类等等)。然后重新build项目,.lib文件应该就会产生了。
    例如这样:

    __declspec(dllexport) void hello(void) {...}

  • 相关阅读:
    bzoj 4017: 小Q的无敌异或
    [TJOI2014] Alice and Bob
    [TJOI2014] 上升子序列
    bzoj 3261: 最大异或和
    bzoj3087: Coci2009 misolovke
    bzoj3521: [Poi2014]Salad Bar
    bzoj4032: [HEOI2015]最短不公共子串
    bzoj1027: [JSOI2007]合金
    bzoj4637: 期望
    bzoj3919: [Baltic2014]portals
  • 原文地址:https://www.cnblogs.com/Crysaty/p/6702836.html
Copyright © 2011-2022 走看看