如何为 MXE 交叉编译器编译 Berkeley DB 5.3.28?
How to compile Berkeley DB 5.3.28 for MXE cross-compiler?
有人为 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 目录
那么如何强制编译器使用这些文件呢?
MXE 开发人员已经慢慢改进了 MXE 部门的构建过程。 Berkeley DB 现在可以在 MXE 源代码中使用 make db
轻松编译您需要的版本,如果需要特定版本,您可以在 src/db.mk 中更改它。 运行 make db
将相应地更新文件。
由于 MXE 中的当前数据库补丁 (src/db-2-install-exe.patch),libtool 无法正确找到数据库二进制文件,因此在 make 过程中出现一个错误在编译 db 期间应用,将被弃用。但是,与此同时,修复方法是删除 db 补丁文件并在 src/db.mk 中添加以下标志以及 (MXE_CONFIGURE_OPTS) 之后的其他配置选项:
--program-transform-name='s,.exe,,;s,\(.*\),.exe,' \
这比使用 BDB 的自定义编译脚本更简单并且保留了 MXE 源 cleaner/manageable。
我改进了构建脚本并解决了我的问题:
我必须修复原始脚本,然后完善构建。
正确的语法如下:
#!/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,\(.*\),.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
更正的问题:
- 设置环境变量定位mingwheaders使用CPPFLAGS变量
- 使用
export <variable>
为 MXE 的编译器为 CC、CXX、AR、STRIP 和 RANLIB 环境变量设置正确的编译器命令和用户命令
成功了!
您可以在此处关注完整的构建:
有人为 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 目录
那么如何强制编译器使用这些文件呢?
MXE 开发人员已经慢慢改进了 MXE 部门的构建过程。 Berkeley DB 现在可以在 MXE 源代码中使用 make db
轻松编译您需要的版本,如果需要特定版本,您可以在 src/db.mk 中更改它。 运行 make db
将相应地更新文件。
由于 MXE 中的当前数据库补丁 (src/db-2-install-exe.patch),libtool 无法正确找到数据库二进制文件,因此在 make 过程中出现一个错误在编译 db 期间应用,将被弃用。但是,与此同时,修复方法是删除 db 补丁文件并在 src/db.mk 中添加以下标志以及 (MXE_CONFIGURE_OPTS) 之后的其他配置选项:
--program-transform-name='s,.exe,,;s,\(.*\),.exe,' \
这比使用 BDB 的自定义编译脚本更简单并且保留了 MXE 源 cleaner/manageable。
我改进了构建脚本并解决了我的问题:
我必须修复原始脚本,然后完善构建。
正确的语法如下:
#!/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,\(.*\),.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
更正的问题:
- 设置环境变量定位mingwheaders使用CPPFLAGS变量
- 使用
export <variable>
为 MXE 的编译器为 CC、CXX、AR、STRIP 和 RANLIB 环境变量设置正确的编译器命令和用户命令
成功了!
您可以在此处关注完整的构建: