zoukankan      html  css  js  c++  java
  • Windows 下编译 ejdb2(msys2+mingw64)

    Windows 下编译 ejdb2(msys2+mingw64)
    目录
    编译前准备
    生成编译脚本
    修改 iowow 项目,使之能够编译通过
    生成VC可调用文件
    EJDB2是根据MIT许可发布的可嵌入JSON数据库引擎。 http://ejdb.org

    因为EJDB2使用C11标准,msvc 不能很好的编译,且它的存储层libiowow库大量使用了 posix 接口实现,所以编译的过程需要做一定的处理。

    编译前准备#
    1、下载并安装编译环境

    这里采用 msys2 + mingw64 作为编译环境。

    首先下载安装 msys2,具体安装过程可以参考官方页面 https://www.msys2.org/
    安装完成之后,修改 pacman 镜像源地址,参考 MSYS2 镜像使用帮助 进行操作。可执行命令pacman -Syu进行基础软件更新,也可以不更新。
    执行命令pacman -S mingw-w64-x86_64-gcc安装编译器等。或者安装完整的工具链软件mingw-w64-x86_64-toolchain。
    执行名称 pacman -S make cmake安装必要的工具软件命令工具。
    安装完成之后,需要打开msys2安装目录下的 mingw64.exe 开启新的命令行窗口。
    注意这里安装的是 mingw-w64-x86_64-gcc 而不是安装 msys2 的gcc。这两个的区别是 使用 mingw-gcc 编译的目标文件是windows原生的,而使用 msys2-gcc 编译的目标文件,依赖于 msys-2.0.dll 提供的虚拟 POSIX 环境,用于给 VC 进行调用的时候会出现错误。

    2、下载源代码

    首先下载 ejdb2 源码,直接使用git克隆仓库。
    下载 iowow 源码。这里也可以不下载,在执行 cmake 的时候可以自动下载。
    Copy

    下载源码文件

    git clone https://github.com/Softmotions/ejdb.git
    git clone https://github.com/Softmotions/iowow.git

    打包 iowow 源码为 zip 包

    cd iowow && git archive --output ../iowow.zip master && cd ..
    生成编译脚本#
    Copy

    创建构建目录并进入

    mkdir build-win && cd build-win

    拷贝下载好的 iowow.zip 到构建目录下的 src 目录

    mkdir src && cp ../../iowow.zip src/

    执行 cmake ,生成 Makefile

    -DCMAKE_C_COMPILER=gcc 指定编译器

    -DCMAKE_BUILD_TYPE=Release 指定构建类型

    -DCMAKE_OSX_ARCHITECTURES=x86_64 指定系统平台架构

    -DENABLE_HTTP=OFF 不开启 http 支持

    -DCMAKE_INSTALL_PREFIX=./output 指定输出目录

    这里不添加 -DWIN32=1 定义,因为 cmake 会报 未知命令 add_w32_importlib 的错误

    add_w32_importlib 是定义在 源码cmake/Modules/Win32LIBTools.cmake文件中的

    这在编译 iowow 库也是一样的情况,我尝试直接在 CMakeLists.txt 中直接 include 这个

    文件,也是没有用的,所以直接先去掉WIN32定义进行编译,再手动生成VC需要的库导出定义文件

    cmake .. -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=x86_64 -DENABLE_HTTP=OFF -DCMAKE_INSTALL_PREFIX=./output
    这时候已经可以编译了,但是链接会无法通过,大量 " 找不到 xxxx 定义" 的报错。执行一次编译,这里需要解压 iowow.zip文件。

    Copy
    make
    Scanning dependencies of target extern_iowow
    [ 2%] Creating directories for 'extern_iowow'
    [ 4%] Performing download step (download, verify and extract) for 'extern_iowow'
    -- File already exists but no hash specified (use URL_HASH):
    file='/d/Downloads/temp/ejdb2/build-win/src/iowow.zip'
    Old file will be removed and new file downloaded from URL.
    -- Downloading...
    dst='/d/Downloads/temp/ejdb2/build-win/src/iowow.zip'
    timeout='360 seconds'
    -- Using src='https://github.com/Softmotions/iowow/archive/master.zip'
    -- [download 100% complete]
    -- Downloading... done
    -- extracting...
    src='/d/Downloads/temp/ejdb2/build-win/src/iowow.zip'
    dst='/d/Downloads/temp/ejdb2/build-win/src/extern_iowow'
    -- extracting... [tar xfz]
    -- extracting... [analysis]
    -- extracting... [rename]
    -- extracting... [clean up]
    -- extracting... done
    [ 7%] No patch step for 'extern_iowow'
    [ 9%] No skip-update step for 'extern_iowow'
    [ 11%] Performing configure step for 'extern_iowow'
    .................... 这里省略很多行..................
    [ 57%] Linking C shared library libejdb2.so
    extern_iowow-build/src/libiowow-1.a(iwlog.c.obj):iwlog.c:(.text+0x237): undefined reference to localtime_r' extern_iowow-build/src/libiowow-1.a(iwexfile.c.obj):iwexfile.c:(.text+0x4f8): undefined reference to msync'
    extern_iowow-build/src/libiowow-1.a(iwexfile.c.obj):iwexfile.c:(.text+0x59d): undefined reference to msync' extern_iowow-build/src/libiowow-1.a(iwexfile.c.obj):iwexfile.c:(.text+0x782): undefined reference to munmap'
    extern_iowow-build/src/libiowow-1.a(iwexfile.c.obj):iwexfile.c:(.text+0xc94): undefined reference to msync' ...................... extern_iowow-build/src/libiowow-1.a(iwfile.c.obj):iwfile.c:(.text+0x42c): undefined reference to xstrndup'
    extern_iowow-build/src/libiowow-1.a(iwal.c.obj):iwal.c:(.text+0xaab): undefined reference to mmap' extern_iowow-build/src/libiowow-1.a(iwal.c.obj):iwal.c:(.text+0xbcf): undefined reference to munmap'
    extern_iowow-build/src/libiowow-1.a(iwal.c.obj):iwal.c:(.text+0xdfd): undefined reference to munmap' extern_iowow-build/src/libiowow-1.a(iwal.c.obj):iwal.c:(.text+0x1077): undefined reference to munmap'
    修改 iowow 项目,使之能够编译通过#
    首先下载一个在 windows 上支持 mmap等 posix 系统调用的库。
    将 mmap 库里面的mman.h、mman.c文件拷贝到build-win/src/src/extern_iowow/src/fs/。
    根据上面报错,修改对应的代码文件 iwlog.c、iwexfile.c、iwal.c。
    修改 fs/iwlog.c 文件 366 行,将 localtime_r(&ts_sec, &timeinfo);修改为localtime_s(&timeinfo,&ts_sec);,也可以使用宏来区分版本。
    修改fs/iwfile.c 文件 39 行,将#define strndup xstrndup修改为#define strndup(s,len) strncpy(malloc(strlen(s) + 1), s, len),这里的修改不是很优,最好还是写成内联函数而不是宏定义的方式。
    进入build-win 下的 src/extern_iowow-build/目录,运行cmake刷新Makefile脚本,然后重新编译 libiowow库。
    回到 build-win 目录,重新执行 make 进行编译。
    Copy

    下载 mmap 库(windows下的mmap实现)

    git clone https://github.com/plettplett/mmap.git

    将对应的源码文件拷贝到对应目录下

    cp ../../mmap/mman.* src/extern_iowow/src/fs/

    进入 iowow 的构建目录

    cd src/extern_iowow-build/

    修改源码文件,这里省略 ....................

    重新执行cmake 命令,更新 Makefile 文件

    cmake ../extern_iowow -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_INSTALL_PREFIX=../../output

    重新生成 libiowow 库,并安装到输出目录

    make && make install

    回到 build-win 目录

    cd ../../

    执行 make 命令,继续生成 libejdb2 库

    make && make install

    生成VC可调用文件#
    1、修改生成的文件名后缀,将.so修改为.dll。不修改也不影响使用,修改会比较好看一点。

    Copy
    cd output
    mv libejdb2.so lib2jdb2.dll
    mv libiowow.dll libiowow.dll
    2、使用 pexports.exe(点此去下载) 生成动态库对应的.def(函数导出定义)文件。

    Copy
    pexports.exe libejdb2.dll -o > libejdb2.def
    pexports.exe libiowow.dll -o > libiowow.def
    生成这两个文件之后,打开这两个文件,将第一行中的文件名的.so修改为.dll。如果前面没有修改后缀名,这里也不修改。

    3、使用Visual Studio自带lib.exe生成对应的.lib文件。

    Copy
    lib /machine:X64 /def:libejdb2.def
    /machine:X64 /def:libiowow.def
    4、修改iwp.h文件。将第 40 行的 #include <sys/time.h>修改为:

    Copy

    ifndef _WIN32

    include <sys/time.h>

    else

    include <sys/types.h>

    endif

    5、拷贝 msys2 安装目录下的 mingw64/bin/libwinpthread-1.dll文件到输出目录,这是一个依赖项。

    编译好的文件可以在这里下载:https://files.cnblogs.com/files/oloroso/ejdb.7z
    https://www.cnblogs.com/oloroso/p/12632412.html

  • 相关阅读:
    Mybatis 原始dao CRUD方法
    JQuery的焦点事件focus() 与按键事件keydown() 及js判断当前页面是否为顶级页面 子页面刷新将顶级页面刷新 window.top.location
    使用actionerror做失败登录验证
    Java项目中的下载 与 上传
    shiro框架 4种授权方式 说明
    javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式
    序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
    Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
    orcal 数据库 maven架构 ssh框架 的全注解环境模版 maven中央仓库批量删除lastupdated文件后依然是lastupdated解决方法 mirror aliyun中央仓库
    EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  • 原文地址:https://www.cnblogs.com/marklove/p/14290304.html
Copyright © 2011-2022 走看看