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 的使用这里就不写了。有空再写一篇博客来介绍。