msys2+mysql_Windows 下编译 ejdb2(msys2+mingw64)

EJDB2是根据MIT许可发布的可嵌入JSON数据库引擎。 http://ejdb.org

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

编译前准备

1、下载并安装编译环境

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

安装完成之后,修改 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.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 进行编译。

# 下载 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 修改为:

#ifndef _WIN32

#include

#else

#include

#endif

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用MSYS2和VS2015编译FFmpeg,你可以按照以下步骤进行操作: 1. 首先,你需要下载并安装MSYS2。你可以从官方网站https://www.msys2.org/下载MSYS2安装程序。 2. 安装完成后,打开MSYS2的命令行界面,并运行以下命令来安装必要的工具:pacman -S make gcc diffutils 3. 为了避免和MSVC的link.exe程序冲突,你需要将C:\msys64\usr\bin\link.exe重命名为C:\msys64\usr\bin\link_orig.exe。 4. 下载YASM(The Yasm Modular Assembler),你可以从官方网站https://www.tortall.net/projects/yasm/wiki/Download下载YASM。将下载的yasm--win64.exe重命名为yasm.exe,并将其拷贝至MSYS2的安装目录(比如C:\msys64)。 5. 现在你可以下载FFmpeg的源代码。你可以从官方GitHub仓库https://github.com/FFmpeg/FFmpeg下载FFmpeg的源码。 6. 打开MSYS2的命令行界面,并切换到FFmpeg源码所在的目录。 7. 运行以下命令来配置FFmpeg的编译选项:./configure --toolchain=msvc --arch=x86_64 --enable-yasm --enable-asm --enable-shared --disable-static 8. 配置完成后,你可以运行make命令来开始编译FFmpeg。请注意,编译过程可能会比较耗时,请耐心等待。 9. 编译完成后,你可以使用编译好的库来进行你的项目开发。 总结一下,使用MSYS2和VS2015编译FFmpeg的步骤包括安装MSYS2、安装必要的工具、重命名link.exe、下载YASM、下载FFmpeg源码、配置编译选项、运行make命令进行编译。希望以上信息对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用msys64+vs2019在编译ffmpeg](https://download.csdn.net/download/ihmhm12345/13116875)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [使用MSYS2 + VS2022编译FFmpeg](https://blog.csdn.net/powang2011/article/details/122724685)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值