libraw静态库与动态库的生成

libraw静态库与动态库的生成

首先附上libraw的网站。链接: libraw.
根据自己的需求选择对应的压缩包
根据自己的需求选择对应的压缩包。我选择的是zip文件,然后解压即可。工程可以直接运行在QT中,也可以运行在VS中。

直接运行对应的qt文件就可以得到对应的动态库。注意只用运行libraw对应的子工程即可。
在这里插入图片描述
动态库会生成对应的dll和lib文件。
在这里插入图片描述

静态库在后缀名为win64.zip或者win32.zip的压缩包里面有。在lib文件夹下面。但是我使用后发现它自带的静态库没有生效。不知道是什么原因。因此我使用vs2015对libraw这个子工程进行了编译,生成静态库。即相应的lib文件。

静态库和动态库使用的区别

在libraw文件夹下面有一个libraw_types.h函数,里面有这样一段定义。即定义LIBRAW_BUILDLIB宏的时候会生成对应的导出库,即动态库(dll文件)。简单来说就是会执行DllDef __declspec(dllexport)。

#ifdef LIBRAW_WIN32_DLLDEFS
#ifdef LIBRAW_NODLL
#define DllDef
#else
#ifdef LIBRAW_BUILDLIB
#define DllDef __declspec(dllexport)
#else
#define DllDef __declspec(dllimport)
#endif
#endif
#else
#define DllDef
#endif
  1. *动态库 ,当使用libraw动态库的时候,按照正常导入即可使用;
  2. *静态库 ,静态库在使用的时候需要注意导入宏
    比如在qt工程中加入
DEFINES+=LIBRAW_BUILDLIB
或者
DEFINES+=LIBRAW_NODLL

按照标准来说这里应该引入

DEFINES+=LIBRAW_NODLL

这样将导致生成一个空的DllDef,还是最上面那个宏里面的逻辑。

#define DllDef

但是为什么在自己的工程里定义DEFINES+=LIBRAW_BUILDLIB也可以呢,因为按照逻辑,当定义了

#ifdef LIBRAW_BUILDLIB

代码将执行

#define DllDef __declspec(dllexport)

对于静态库的使用来说这是没有影响的。当然对于静态库你也不应该有这东西。

重点来了重点来了重点来了
对于静态库一定不要引入

#define DllDef __declspec(dllimport)

简单来说对于使用libraw静态库,你必须导入一个宏,不然进执行__declspec(dllimport)。但是你是静态库,没有dll,这将导致报错。

总结

动态库的使用是比较常见的。libraw提供的源代码如果运行在qt环境下也是默认生成动态库。但如果是要生成静态库,就要注意在使用libraw静态库的时候需要在工程中声明一个宏:DEFINES+=LIBRAW_NODLL(另外一个也可以,但是属于剑走偏着)。核心就是要避免__declspec(dllimport)的执行,不然将导致使用静态库失败。
第一篇博客,总结不好,见谅。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值