windows下msvc/mingw静态编译 lmdb的CMakeLists.txt

LMDB的全称是Lightning Memory-Mapped Database,闪电般的内存映射数据库,在github可以找到源码

https://github.com/LMDB/lmdb/tree/mdb.master/libraries/liblmdb

在caffe中被用到,这个数据库的源码只有两个.c文件,但只提供了unix格式的Makefile,在windows要编译有点麻烦。 为了实现在windows下的编译,我写了个CMakeLists.txt,这样就可以用非常方便的用cmake实现windows/linux下的跨平台编译了。

CMakeLists.txt

以下是完整的cmake脚本,放在lmdb源码文件夹下,(linux下gcc编译通过,windows下vs2015/mingw64编译通过) CMakeLists.txt

# cmake project script for lmdb 0.9.21
# author guyadong@gdface.net 2017/06/22
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
PROJECT(lmdb VERSION  0.9.21 LANGUAGES  C)
# 编译开关,用于关闭编译警告
OPTION(CLOSE_WARNING "close warning,default off" OFF)
# 编译开关,用于指定是否编译测试代码
OPTION(BUILD_TEST "build test program,default off" OFF)
IF (MSVC)
    # for #include <unistd.h>
    INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR} )
ENDIF(MSVC)
# option 
IF( CLOSE_WARNING)
    #close warning
    IF (MSVC)       
        ADD_COMPILE_OPTIONS( /wd4267 /wd4996 /wd4477 /wd4244 /wd4146 /wd4333 /wd4172)   
        ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
    ELSE()  
        ADD_COMPILE_OPTIONS(-Wno-return-local-addr) 
    ENDIF(MSVC)
ENDIF(CLOSE_WARNING)

# lmdb 库(静态)
ADD_LIBRARY(lmdb STATIC mdb.c midl.c)
IF (UNIX)
    SET(CMAKE_EXE_LINKER_FLAGS "-pthread ${CMAKE_EXE_LINKER_FLAGS}")
    SET(CMAKE_SHARED_LINKER_FLAGS "-pthread ${CMAKE_SHARED_LINKER_FLAGS}")
ENDIF (UNIX)

# add executable target 
FUNCTION (LMDB_ADD_EXE EXE_NAME SOURCE_FILE)
    IF (NOT EXE_NAME)
        MESSAGE(FATAL_ERROR "Error: LMDB_ADD_TEST called without test name")
    ENDIF(NOT EXE_NAME)

    IF (NOT SOURCE_FILE)
        MESSAGE(FATAL_ERROR "Error: LMDB_ADD_TEST called without test file")
    ENDIF(NOT SOURCE_FILE)
        IF (${SOURCE_FILE})
        ADD_EXECUTABLE(${EXE_NAME} ${${SOURCE_FILE}})
        ELSE()
        ADD_EXECUTABLE(${EXE_NAME} ${SOURCE_FILE})
        ENDIF()

    TARGET_LINK_LIBRARIES(${EXE_NAME} lmdb)

    #ADD_TEST(NAME ${EXE_NAME} COMMAND ${EXE_NAME})

    #ADD_DEPENDENCIES(RUN_LMDB_UNIT_TESTS ${EXE_NAME})
    INSTALL (TARGETS ${EXE_NAME}  RUNTIME DESTINATION bin)
ENDFUNCTION (LMDB_ADD_EXE)
IF (MSVC)
    # add getopt.c for #include <unistd.h> 
    SET(MDB_STAT_SRCS mdb_stat.c getopt.c)
    SET(MDB_COPY_SRCS mdb_copy.c getopt.c)
    SET(MDB_DUMP_SRCS mdb_dump.c getopt.c)
    SET(MDB_LOAD_SRCS mdb_load.c getopt.c)
ELSE()
    SET(MDB_STAT_SRCS mdb_stat.c)
    SET(MDB_COPY_SRCS mdb_copy.c)
    SET(MDB_DUMP_SRCS mdb_dump.c)
    SET(MDB_LOAD_SRCS mdb_load.c)
ENDIF(MSVC)   

LMDB_ADD_EXE(mdb_stat MDB_STAT_SRCS)
LMDB_ADD_EXE(mdb_copy MDB_COPY_SRCS)
LMDB_ADD_EXE(mdb_dump MDB_DUMP_SRCS)
LMDB_ADD_EXE(mdb_load MDB_LOAD_SRCS)
IF ( BUILD_TEST )
    LMDB_ADD_EXE(mtest mtest.c)
    LMDB_ADD_EXE(mtest2 mtest2.c)
    LMDB_ADD_EXE(mtest3 mtest3.c)
    LMDB_ADD_EXE(mtest4 mtest4.c)
    LMDB_ADD_EXE(mtest5 mtest5.c)
ENDIF(BUILD_TEST)

INSTALL (TARGETS lmdb mdb_stat mdb_copy mdb_dump mdb_load 
    RUNTIME DESTINATION bin 
    LIBRARY DESTINATION lib 
    ARCHIVE DESTINATION lib)
INSTALL (FILES lmdb.h DESTINATION include)
INSTALL (FILES  mdb_stat.1 mdb_copy.1 mdb_dump.1 mdb_load.1     DESTINATION share/man/man1)

可以从这里下载完整的基于lmdb-0.9.21的CMakeLists.txt https://code.csdn.net/10km/caffe-static/tree/master/patch/lmdb-0.9.21/CMakeLists.txt

MSVC编译

rem 创建 vs2015 x64编译环境
rem 如果要编译32位版本,则将后面的x86_amd64改为x86
call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
rem $lmdb_source_root 为lmdb源码的根目录 
rem cd $lmdb_source_root\libraries\liblmdb
mkdir build
cd build
rem %install_path% 安装路径
cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE:STRING=RELEASE ^
    -DCMAKE_INSTALL_PREFIX=$install_path ^
    -DCLOSE_WARNING=on ^
    -DBUILD_TEST=off ^
    -DBUILD_SHARED_LIBS=off
rem 编译并安装到CMAKE_INSTALL_PREFIX指定的位置
nmake install

MinGW编译

rem cd $lmdb_source_root\libraries\liblmdb
mkdir build
cd build
rem %install_path% 安装路径
cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE:STRING=RELEASE ^
    -DCMAKE_INSTALL_PREFIX=$install_path ^
    -DCLOSE_WARNING=on ^
    -DBUILD_TEST=off ^
    -DBUILD_SHARED_LIBS=off
rem 编译并安装到CMAKE_INSTALL_PREFIX指定的位置
make -j 8 install

Linux下gcc编译

install_path=$LMDB_INSTALL_PATH
echo install_path:$install_path
pushd $LMDB_FOLDER/libraries/liblmdb
mkdir build.gcc
cd build.gcc
cmake .. -G "Unix Makefiles" \
    -DCMAKE_BUILD_TYPE:STRING=RELEASE \
    -DCMAKE_INSTALL_PREFIX=$install_path \
    -DBUILD_SHARED_LIBS=off \
    -DBUILD_TEST=off  
make -j 8 install 
popd

windows补丁

lmdb的源码中用到了unistd.h这个include文件。unistd.h是unix std的意思,是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数。所以MSVC编译时如果没有这个文件,肯定是要报错的。为解决这个问题,就需要几个补丁文件:

从这里 https://github.com/barrysteyn/scrypt-windows/tree/master/win下载如下三个文件

include/unistd.h include/getopt.h getopt.c

复制到 lmdb源码的根目录下(无include文件夹)就可以了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

RMAN CATALOG命令手动注册磁带库中的备份片

ORACLE 官方文档中介绍 CATALOG 命令只能注册在磁盘中的备份片,在现在多数环境中备份时,备份集都是放到磁带库中,那么 CATALOG 命令真就不支持...

1251
来自专栏技术博文

php QR Code二维码生成类

<?php /* * PHP QR Code encoder * * This file contains MERGED version of PHP ...

3495
来自专栏黑白安全

秒杀杀软的badusb

我们看过很多黑客电影,上面的黑客利用一个U盘轻松入侵到对方计算机。觉得很酷,今天我们也来做一个吧。

2743
来自专栏Albert陈凯

2018-09-17 Vagrant 启动报错

Stderr: VBoxManage.exe: error: VT-x is disabled in the BIOS for all CPU modes (V...

1042
来自专栏dalaoyang

SpringBoot整合Redis

偷懒了几天,好几天没写springboot了。真的不是没什么可写,是因为坚持做一件事真的很难。 今天抽空弄了一个springboot整合redis的小例子。 ...

2975
来自专栏贾老师の博客

CMake 使用

763
来自专栏Netkiller

Glusterfs 文件系统

Glusterfs 我的系列文档 Netkiller Architect 手札 Netkiller Developer 手札 Netkiller PHP...

33810
来自专栏乐沙弥的世界

Failed to create or upgrade OLR

    对于Oracle 11g RAC 的安装,与Oracle 10g(clusterware)类似,grid 安装完毕后需要执行orainstroot.sh...

644
来自专栏debugeeker的专栏

确定core文件是由哪个文件产生的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

892
来自专栏生信技能树

linux 命令中英文对照,收集

听说markdown排版得用浏览器打开,点击最下面的阅读原文也可以! Is Linux CLI case-sensitive? The answer is, y...

3576

扫码关注云+社区