Data Matrix 二维码解码库 libdmtx 编译方法
libdmtx 是一个开源的 Data Matrix 编解码库。项目主页在:https://github.com/dmtx
这里简单记录一下libdmtx 在win平台上如何编译的问题。
libdmtx 早期版本的源代码是不支持用微软的 VS 编译的,用 VS 编译需要改一些代码。当时在 win 上编译需要 mingw 或者 cygwin。
不过新版的代码里面包含了 CMakeLists.txt 。说明已经使用了 CMake 作为编译管理系统。我试了一下,用 CMake 是可以生成 VS 的项目文件的,也能编译成功。不过用 CMake 编译似乎只能生成静态库,无法生成 dll。为什么无法生成 dll 其实也很好理解,VS 编译器生成 DLL 文件时要求导出函数的函数声明要加上 __declspec(dllexport) 。不加这个修饰对应的函数是导不出来的。
可是 libdmtx 的源码里没有 __declspec(dllexport) ,所以即使生成了 DLL 也没法使用。因此用CMake生成项目文件时也就只是支持静态库。
这里我简单讲讲利用 CMake 和 MinGW32 生成库文件时的几个要点。
用 CMake 时其实没太多可说的。用 CMake-gui 配置一下项目,然后生成 VS 项目文件。打开 VS 直接编译就行了。生成的静态库名为 dmtx.lib。
如果用 MinGW32 编译就稍微复杂一点。我用的是 MSYS2。
libdmtx 源码目录里没有 configure 文件。所以需要先执行:
autogen.sh
autogen 的作用是生成 configure 文件。然后执行:
$ ./configure
$ make
这两行执行完就生成了静态库。文件都在 .libs 目录中。
进入到 .libs 目录可以看到如下的文件:
- libdmtx.a
- libdmtx.la
- libdmtx.lai
- libdmtx_la-dmtx.o
有了这几个文件就可以在 MinGW32 下使用了。但是如果是用 VS 编译器则还是不够,使用时会提示缺少很多的函数,比如 gettimeofday, sincos 。所以我们还要针对 libdmtx.a 再处理一下,生成 Dll 文件。
就一条语句就行。
$ gcc -shared -o dmtx.dll libdmtx_la-dmtx.o -Wl,--out-implib,libdmtx.a
执行这个之后就有了 dmtx.dll。libdmtx.a 也从几百 kB 变成了几十 kB。说明 libdmtx.a从一个静态库变为了 Dll 的导入库。为了在 VS 中使用。我们把 libdmtx.a 改名为 libdmtx.lib。
在 VS 中使用 libdmtx 我们只需要三个文件。
- libdmtx.lib
- dmtx.dll
- dmtx.h
libdmtx 的使用这里就不写了。有空再写一篇博客来介绍。