如何为 MXE 交叉编译器编译 Berkeley DB 5.3.28?

Posted

技术标签:

【中文标题】如何为 MXE 交叉编译器编译 Berkeley DB 5.3.28?【英文标题】:How to compile Berkeley DB 5.3.28 for MXE cross-compiler? 【发布时间】:2018-06-01 08:26:26 【问题描述】:

有没有人为 MXE 的交叉编译环境构建 Berkeley DB 的解决方案?

当我运行构建脚本时:

 #!/bin/bash

 MXE_PATH=/path/to/mxe
 
 db=db-5.3.28

 rm -rf ./$db/build_mxe
 mkdir -p ./$db/build_mxe
 cd ./$db/build_mxe
 
 sed -i "s/WinIoCtl.h/winioctl.h/g" ../src/dbinc/win_db.h

 CC=$MXE_PATH/usr/bin/i686-w64-mingw32.static-gcc \
 CXX=$MXE_PATH/usr/bin/i686-w64-mingw32.static-g++ \

 ../dist/configure \
     --build=x86_64-pc-linux-gnu \
     --host=x86 \
     --disable-replication \
     --enable-cxx \
     --enable-mingw \
     --prefix=/path/to/dev/mingw_db

  make -j6; make -j6 install

编译器警告缺少direct.h:

../src/dbinc/win_db.h:21:20: fatal error: direct.h: No such file or directory compilation terminated.

direct.h 和所有依赖文件都存在于 mxe/usr/i686-w64-mingw32.static/include 目录中

那么如何强制编译器使用这些文件呢?

【问题讨论】:

您是否尝试过使用 -I 选项将此目录传递给编译器? 【参考方案1】:

MXE 开发人员已经慢慢改进了 MXE 部门的构建过程。 Berkeley DB 现在可以在 MXE 源代码中使用 make db 轻松编译您需要的版本,如果需要特定版本,您可以在 src/db.mk 中更改它。再次运行make db 将相应地更新文件。

在 make 过程中出现一个错误,其中 libtool 无法正确找到 db 二进制文件,原因是 MXE 中的当前 db 补丁 (src/db-2-install-exe.patch) 在编译 db 期间应用,该补丁将被弃用。但是,与此同时,修复方法是删除 db 补丁文件并在 src/db.mk 中添加以下标志以及 (MXE_CONFIGURE_OPTS) 之后的其他配置选项:

--program-transform-name='s,.exe,,;s,\(.*\),\1.exe,' \

与使用 BDB 的自定义编译脚本相比,这更简单,并且使 MXE 源代码更清晰/易于管理。

【讨论】:

我正在尝试修复 mxe 上的 db 构建;我试过了,但它不起作用;我正在查看临时构建树,我看不出与以前有任何区别(同样的错误无法找到文件,因为它们都有 .exe 扩展名) 确保你的构建树是干净的。可能重新克隆 mxe github。我已经有一段时间没有这样做了。从那时起,他们可能已经更新了编译过程。如果程序发生了变化,我将无法与程序相提并论。检查mxe.cc 和github.com/mxe。另请参阅bitcointalk.org/index.php?topic=1080289.0 以获得一些指导。 我只是尝试了一个基本的 mxe 设置,用 make cc 编译 mxe,然后用 make db 构建 db,没有问题。它确实使用 db v6.1.26 编译。然后我将它切换到版本 5.3.28 并且也编译没有错误。 我正在使用 gcc8 并尝试将其更新到最新的稳定版本(不过,master 上的 6.1.26 给了我同样的问题) @GregorioLitenstein 可以请在pastebin.com 上发布由 gcc 和 db(分别)编译错误导致的日志文件。我自己在使用 mxe 的更新脚本(make update-package-gcc(gc 也是)然后make gcc)来检查/更新它为 gc 下载版本 10.1.0 和 8.0.4 的 gcc 时遇到了一个错误。如果我们最终遇到同样的错误,那么你应该在 mxe 的 github 上提交一个新问题。【参考方案2】:

我改进了构建脚本并解决了我的问题:

我必须修复原始脚本,然后完善构建。

正确的语法如下:

#!/bin/bash

## Path to MXE source
 MXE_PATH=/home/demon/dev/mxe
## Path for mingw headers
 MXE_INCLUDE=$MXE_PATH/usr/i686-w64-mingw32.static/include

## Path to db source
 db=db-6.1.26

## Make a clean working tree and Create working DIR 
## You can also use `make distclean` within build_mxe to start fresh
 
 rm -rf ./$db/build_mxe
 mkdir -p ./$db/build_mxe

## Enter working directory
 cd ./$db/build_mxe

## Correct naming of header file
 sed -i "s/WinIoCtl.h/winioctl.h/g" ../src/dbinc/win_db.h


## Define CC and C++ compiler & user level commands
export CC=$MXE_PATH/usr/bin/i686-w64-mingw32.static-gcc
export CXX=$MXE_PATH/usr/bin/i686-w64-mingw32.static-g++
export AR=$MXE_PATH/usr/bin/i686-w64-mingw32.static-ar
export STRIP=$MXE_PATH/usr/bin/i686-w64-mingw32.static-strip
export RANLIB=$MXE_PATH/usr/bin/i686-w64-mingw32.static-ranlib

### Find mingw headers in non-standard directory
export CPPFLAGS=-I$MXE_INCLUDE


## Configure the build
 ../dist/configure \
     --build=x86_64-pc-linux-gnu \
     --host=x86 \
     --disable-replication \
     --enable-cxx \
     --enable-mingw \
     --program-transform-name='s,.exe,,;s,\(.*\),\1.exe,' \
     --prefix=/home/demon/dev/mxe_db \
     --exec-prefix=/home/demon/dev/mxe_db

## Build DB and install it
 make -j(nproc); make -j(nproc) install

更正的问题:

设置环境变量以使用 CPPFLAGS 变量定位 mingw 标头 使用export <variable> 为 MXE 的编译器设置 CC、CXX、AR、STRIP 和 RANLIB 环境变量的正确编译器命令和用户命令

成功了!

您可以在此处关注完整的构建:

https://pastebin.com/aP5rWQSC

输出 (--prefix) 目录完成构建的内容:

【讨论】:

@GregorioLitenstein 这应该会为您解决构建问题。

以上是关于如何为 MXE 交叉编译器编译 Berkeley DB 5.3.28?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MXE - GSL 链接在 Linux for Windows 上进行交叉编译?

如何为linux和udev的arm视频交叉编译

如何为 arm-v7 交叉编译 qt 应用程序

如何为自定义 CPU 创建 C 编译器?

MIPS交叉编译错误:非法指令

如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?