• Windows 下编译 ejdb2(msys2+mingw64)


    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 的时候可以自动下载。
    # 下载源码文件
    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 ..
    

    生成编译脚本

    # 创建构建目录并进入
    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文件。

     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.hmman.c文件拷贝到build-win/src/src/extern_iowow/src/fs/
    • 根据上面报错,修改对应的代码文件 iwlog.ciwexfile.ciwal.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 进行编译。
    # 下载 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。不修改也不影响使用,修改会比较好看一点。

    cd output
    mv libejdb2.so lib2jdb2.dll
    mv libiowow.dll libiowow.dll
    

    2、使用 pexports.exe(点此去下载) 生成动态库对应的.def(函数导出定义)文件。

    pexports.exe libejdb2.dll -o > libejdb2.def
    pexports.exe libiowow.dll -o > libiowow.def
    

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

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

    lib /machine:X64 /def:libejdb2.def
    /machine:X64 /def:libiowow.def
    

    4、修改iwp.h文件。将第 40 行的 #include <sys/time.h>修改为:

    #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

  • 相关阅读:
    18款 非常实用 jquery幻灯片图片切换
    6款强大的 jQuery 网页布局创建及优化插件
    18 个最新实用的 jQuery 插件
    jQuery中的编程范式
    JQuery _ 定时器(jQuery Timers) 学习
    21个最佳jQuery插件推荐
    7 款基于 JavaScript/AJAX 的文件上传插件
    C#
    kernel 3.10内核源码分析--hung task机制
    进程的虚拟地址空间
  • 原文地址:https://www.cnblogs.com/oloroso/p/12632412.html
Copyright © 2020-2023  润新知