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 条评论
登录 后参与评论

相关文章

来自专栏cmazxiaoma的架构师之路

VMware WorkStation的烦心事

1492
来自专栏杨建荣的学习笔记

10g升级至11g后数据库无法启动的问题解决

今天升级数据库碰到一个很郁闷的问题,把10g的数据库升级到11g以后,结果有一个改动,需要重启数据库,就敲了shutdown immediate,结果再star...

3726
来自专栏happyJared

Spring Boot 1.0 && 2.0 + Mybatis 多数据源配置与使用

mysql 对应的数据源配置中,定义了实体 Boy 和对应的数据层接口 BoyMapper:

833
来自专栏杨建荣的学习笔记

使用shell定制addm脚本(r3笔记第88天)

在10g开始推出的addm对于工作中的调优能够提供很多的帮助,而且建议也更加客观和全面。但是使用addmrpt.sql的时候还是有些慢, 可以使用如下的脚本来定...

2144
来自专栏linux驱动个人学习

高通 sensor 从native到HAL

前几篇sensor相关的文章介绍了sensor的hal的知识,以press_sensor实时显示气压坐标来分析,app层数据获取的过程,其实实现数据监控非常简单...

2402
来自专栏码匠的流水账

聊聊jesque的event机制

jesque-2.1.2-sources.jar!/net/greghaines/jesque/worker/WorkerEvent.java

671
来自专栏Ken的杂谈

Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

本项目构建基于:https://ken.io/note/springboot-course-basic-helloworld

1863
来自专栏蓝天

零停重启程序工具Huptime研究

零停重启目标程序,比如一个网络服务程序,不用丢失和中断任何消息实现重新启动,正在处理的消息也不会中断和丢失,重启的方法是给目标程序的进程发SIGHUP信号。...

731
来自专栏数据库新发现

使用Oracle Wrap工具加密你的代码

Last Updated: Monday, 2004-11-15 22:31 Eygle

822
来自专栏10km的专栏

cmake:vs2015/MinGW静态编译leveldb

leveldb是google的开源项目(https://github.com/google/leveldb), 在linux下编译很方便,然而官方版本却没有提供...

4616

扫码关注云+社区