windows下msvc/mingw静态编译 lmdb的CMakeLists.txt
来源:互联网 发布:刺客聂隐娘 知乎 编辑:程序博客网 时间:2024/05/21 07:50
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/22CMAKE_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改为x86call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64rem $lmdb_source_root 为lmdb源码的根目录 rem cd $lmdb_source_root\libraries\liblmdbmkdir buildcd buildrem %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=offrem 编译并安装到CMAKE_INSTALL_PREFIX指定的位置nmake install
MinGW编译
rem cd $lmdb_source_root\libraries\liblmdbmkdir buildcd buildrem %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=offrem 编译并安装到CMAKE_INSTALL_PREFIX指定的位置make -j 8 install
Linux下gcc编译
install_path=$LMDB_INSTALL_PATHecho install_path:$install_pathpushd $LMDB_FOLDER/libraries/liblmdbmkdir build.gcccd build.gcccmake .. -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文件夹)就可以了
- windows下msvc/mingw静态编译 lmdb的CMakeLists.txt
- Windows下Qt4.8.5 + mingw静态编译
- Windows下MinGW编译静态Qt5 I
- Windows MSVC vs MinGW
- SymbolicC++ 在MinGW下的静态编译
- CmakeLists.txt protobuf编译
- quazip 在windows msvc 2005 下的编译
- 在Windows下使用MinGW静态编译Assimp
- Windows下MinGW编译静态Qt I 之实践
- Windows下使用CMake+MinGW静态编译发布.exe程序
- MSVC/MinGW中导入glog静态库的正确方式
- Poppler 及 Poppler-Qt4 在Windows下基于MinGW的静态编译 - Poppler Qt4
- 在windows下用Qt creator + mingw编译protobuf源码生成静态链接库的方法
- 在Windows 10下使用MinGW静态编译Qt 5.9.1的详细过程(Ver 17.0819)
- QT系列:MinGW与MSVC编译的区别
- CMakeLists.txt的写法
- CMakeLists.txt的写法
- CMakeLists.txt的写法
- 2017-06-23
- 继承之Protected关键字
- 30分钟掌握ES6/ES2015核心内容(上)
- 单页应用
- 【Android】第三章 用户界面(上)
- windows下msvc/mingw静态编译 lmdb的CMakeLists.txt
- 【技术分享】手把手教你使用PowerShell实现一句话Web客户端
- Python中模块使用详解
- 给bin下面所有的.sh增加权限
- 畅聊视频点播与媒体转码工作流
- 模板模式,程序员的一天
- JS 声明对象的方法
- 配置一个简单的maven工程,实现自动打包,自动编译
- bootstrap模态框中js执行不了 运行js脚本无响应