在Fedora上使用MinGW64编译Windows的boost-python 1.73.0

问题描述

我需要在Fedora的生皮上使用MinGW64编译boost-python 1.73.0,以便为Windows 10 64bit构建Python绑定(不,我不能使用Visual Studio)。不幸的是,Fedora的mingw64-boost软件包中唯一缺少的库是boost-python,哎呀!

实际上,所有依赖项都打包在Fedora for MinGW64上,这非常不错。所以我正在尝试建立自己:

wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.bz2
tar -xjf boost_1_73_0.tar.bz2 && cd boost_1_73_0
./bootstrap.sh
# in a docker container,so /root
./b2 --with-python address-model=64 target-os=windows toolset=gcc-mingw64 \
     variant=release link=shared --user-config=/root/user-config.jam 

还有一个~/user-config.jam

using gcc : mingw64 : x86_64-w64-mingw32-g++ ;

using python
     : 3.9
     : /usr/x86_64-w64-mingw32/sys-root/mingw/bin/python3.9.exe
     : /usr/x86_64-w64-mingw32/sys-root/mingw/include/python3.9
     : /usr/x86_64-w64-mingw32/sys-root/mingw/lib/python3.9 ;

它成功运行了一段时间,但随后出现错误

/usr/lib/gcc/x86_64-w64-mingw32/10.2.1/../../../../x86_64-w64-mingw32/bin/ld: cannot find -lutil
collect2: error: ld returned 1 exit status

所以libutil丢失了。真是个超级特定的名字!我尝试(重新)安装所有glibc软件包(显然通常在其中的libutil.so),无济于事。还找到了/usr/x86_64-w64-mingw32/sys-root/mingw/lib/libutildll.a,尝试通过./b2 library=...包含它,再次没有运气。

这是怎么回事?顺便说一句,this gist的完整命令失败了。

解决方法

因此,这需要对升压源进行修补才能摆脱libutil链接。为了完全编译,必须应用一批其他补丁文件。这是我在fedora:rawhide中的完整命令链:

  1. 获取资源
wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.bz2
tar -xjf boost_1_73_0.tar.bz2
cd boost_1_73_0
  1. 设置~/user-config.jam
cat >> ~/user-config.jam <<EOL
using gcc : mingw64 : x86_64-w64-mingw32-g++ ;

using python
     : 3.9
     : /usr/x86_64-w64-mingw32/sys-root/mingw/bin/python3.9
     : /usr/x86_64-w64-mingw32/sys-root/mingw/include/python3.9
     : /usr/x86_64-w64-mingw32/sys-root/mingw/lib/python3.9/config-3.9 ;
EOL
  1. 引导增强
./bootstrap.sh --with-icu=/usr/x86_64-w64-mingw32/sys-root/mingw/ --with-toolset=gcc
  1. 从{li>修补./boost_1_73_0_patches中的所有文件

通常这样申请:

patch -p1 -i patches/boost-1.63.0-python-test-PyImport_AppendInittab.patch
  1. 构建boost-python
./b2 address-model=64 link=shared runtime-link=shared threading=multi threadapi=win32 toolset=gcc variant=release python=3.9 --with-python

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...