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

本文介绍如何使用CMakeLists.txt实现LMDB数据库在Windows和Linux下的跨平台编译。提供了一份完整的CMake配置脚本,适用于VS2015/MINGW64和GCC编译器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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文件夹)就可以了

<think>好的,我现在需要解决用户遇到的CMake错误:源目录中找不到CMakeLists.txt文件。首先,我得了解这个错误的常见原因和解决方法。根据用户提供的引用内容,特别是引用[2]和引用[3],可能涉及路径问题、文件缺失或配置错误。 首先,用户可能没有在正确的目录下运行CMake。正确的做法是确保CMake在包含CMakeLists.txt的目录中执行。如果用户指定的路径"D:/Program Files/VTKSrc"确实没有这个文件,那可能是项目未正确克隆或解压,或者路径输入错误。需要检查路径是否正确,并确认CMakeLists.txt是否存在。 其次,引用[3]提到,在CMakeLists.txt中需要包含launch目录的安装指令。这可能提示用户的项目结构可能有问题,或者CMakeLists.txt本身缺少必要的配置。用户需要检查CMakeLists.txt的内容,确保必要的文件和目录被正确包含。 另外,引用[2]中用户尝试了重命名CMakeLists.txt、重新安装软件等操作,但问题依旧。这说明可能环境变量或依赖项存在问题。需要检查CMakeMingw等工具是否正确安装,路径是否添加到系统环境变量中。还有,VS Code的插件配置是否正确,例如ESP-IDF插件可能需要特定设置。 可能的解决步骤包括: 1. 确认CMakeLists.txt存在于指定目录。 2. 检查CMake命令或GUI中指定的源目录是否正确。 3. 确保项目结构正确,所有必要文件都在相应位置。 4. 重新生成或修复CMakeLists.txt文件,特别是如果项目是从其他地方复制来的,可能需要调整路径。 5. 检查构建工具的安装和环境变量配置。 另外,用户可能需要初始化或更新子模块(如果有的话),或者安装缺失的依赖库。如果用户手动创建了CMake项目,可能需要添加基本的CMake命令,如cmake_minimum_required和project()。 最后,如果所有配置都正确,但问题仍然存在,可能需要清理构建目录并重新生成缓存,或者检查文件权限问题,确保CMake可以读取相关文件。</think>### 解决CMake未找到CMakeLists.txt文件的错误 #### 1. 确认文件存在性 - **检查路径正确性**:确保指定的源目录(如$D:/Program Files/VTKSrc$)确实包含$CMakeLists.txt$。可通过文件管理器手动验证,或使用命令行工具`ls`(Linux/macOS)或`dir`(Windows)查看目录内容。 - **常见场景**: - 项目未完整下载(如Git仓库未包含子模块),需执行`git submodule update --init`[^2]。 - 手动创建项目时忘记添加$CMakeLists.txt$,需新建文件并写入基本配置: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject) ``` #### 2. 修正CMake命令参数 - **命令行调用**:若通过命令行执行,需确保路径参数正确。例如: ```bash cmake -B build/ -S . # 明确指定源码路径为当前目录(含CMakeLists.txt) ``` - **GUI工具配置**:在CMake GUI中,需正确填写`Where is the source code`和`Where to build the binaries`路径[^1]。 #### 3. 修复项目配置 - **文件层级问题**:若项目包含多个子目录,需确认顶层$CMakeLists.txt$通过`add_subdirectory()`正确引用子模块[^3]。 - **安装指令缺失**:若涉及资源文件(如launch文件),需在$CMakeLists.txt$中添加安装指令: ```cmake install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) # 引用[3] ``` #### 4. 检查开发环境 - **工具链完整性**:确认CMake编译工具链(如GCC、MSVC)已正确安装,且路径添加到系统环境变量(如`PATH`中需包含CMake的`bin`目录)。 - **IDE/编辑器插件**:在VSCode等编辑器中,需确保插件(如CMake Tools、ESP-IDF)配置的构建目录与项目路径一致。 #### 5. 其他高级排查 - **清理缓存**:删除`build/`或`CMakeCache.txt`文件后重新生成。 - **文件权限**:确保当前用户对目录和文件有读取权限(Linux/macOS使用`chmod`,Windows检查安全属性)。 - **符号链接问题**:若路径包含符号链接,尝试改用绝对物理路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值