Windows下msvc/mingw静的コンパイルlmdbのCMakeLists.txt
LMDBのフルネームはLightning Memory-Mapped Databaseで、稲妻のようなメモリマッピングデータベースで、githubでソースコードを見つけることができます
https://github.com/LMDB/lmdb/tree/mdb.master/libraries/liblmdb
caffeで用いる、このデータベースのソースコードは2つしかない.cファイルですが、unix形式のMakefileしか提供されていませんので、windowsでコンパイルするのはちょっと面倒です.Windowsでのコンパイルを実現するためにCMakeListsを書きました.txtは、cmakeでwindows/linuxのプラットフォーム間コンパイルを実現するのに非常に便利です.
CMakeLists.txt
以下は完全なcmakeスクリプトで、lmdbソースフォルダの下に置いて、(linuxの下でgccコンパイルが通過し、windowsの下でvs 2015/mingw 64コンパイルが通過した)CMakeLists.txt
ここからlmdb-0.9.21ベースのCMakeListsを完全にダウンロードできます.txt https://code.csdn.net/10km/caffe-static/tree/master/patch/lmdb-0.9.21/CMakeLists.txt
MSVCコンパイル
MinGWコンパイル
Linuxでのgccコンパイル
Windowsパッチ
lmdbのソースコードには
ここからhttps://github.com/barrysteyn/scrypt-windows/tree/master/win次の3つのファイルをダウンロードします.
include/unistd.h include/getopt.h getopt.c
lmdbソースのルートディレクトリ(includeフォルダなし)にコピーすればいいです
https://github.com/LMDB/lmdb/tree/mdb.master/libraries/liblmdb
caffeで用いる、このデータベースのソースコードは2つしかない.cファイルですが、unix形式のMakefileしか提供されていませんので、windowsでコンパイルするのはちょっと面倒です.Windowsでのコンパイルを実現するためにCMakeListsを書きました.txtは、cmakeでwindows/linuxのプラットフォーム間コンパイルを実現するのに非常に便利です.
CMakeLists.txt
以下は完全なcmakeスクリプトで、lmdbソースフォルダの下に置いて、(linuxの下でgccコンパイルが通過し、windowsの下でvs 2015/mingw 64コンパイルが通過した)CMakeLists.txt
# cmake project script for lmdb 0.9.21
# author [email protected] 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
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
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クラスシステム定義シンボル定数のヘッダファイルであり、read関数、write関数、getpid関数などのUNIXシステムサービスの関数プロトタイプが多く含まれている.だからMSVCのコンパイル時にこのファイルがなければ、間違いを報告するに違いない.この問題を解決するには、いくつかのパッチが必要です.ここからhttps://github.com/barrysteyn/scrypt-windows/tree/master/win次の3つのファイルをダウンロードします.
include/unistd.h include/getopt.h getopt.c
lmdbソースのルートディレクトリ(includeフォルダなし)にコピーすればいいです