我要交叉编译PyZmq适用于 ARM-Cortex-A8 处理器 (AM335)。但就我而言,编译器正在使用该处理器不可用的标志运行。
我关注了this和 this发布并考虑到提到的补丁已过时,我目前正在遵循此过程:
- 有可用的目标工具链(已测试)
- 使用此工具链编译 ZeroMQ(有效)
- 有可用于目标的 python3 库和 header
- 已安装适用于 Python3 的 Cython(针对主机平台)
我的 setup.cfg 如下所示:
[global] have_sys_un_h = False [build_ext] libraries = python3.1 library_dirs = ../path/to/target/python/lib/python3.1 include_dirs = ../path/to/target/python/include/python3.1/ [bdist_egg] plat-name = linux-armv
然后我运行:
git clone git://github.com/zeromq/pyzmq.git pyzmq-arm-cortexa8/
cd pyzmq-git-arm-cortexa8/
export PATH=/path/to/compiler/bin:$PATH
export CC="arm-cortexa8-linux-gnueabihf-gcc"
export LDSHARED="arm-cortexa8-linux-gnueabihf-gcc -shared"
python3 ./setup.py configure --zmq=../zeromq-4.0.4-arm-cortexa8/
python3 ./setup.py build
但是构建 Cython 生成的文件失败 - 输出为:
running build
running build_py
running build_ext
running configure
Warning: Skipping zmq version check
************************************************
skipping 'zmq/backend/cython/_device.c' Cython extension (up-to-date)
building 'zmq.backend.cython._device' extension
arm-cortexa8-linux-gnueabihf-gcc -Wno-unused-result -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I../zeromq-4.0.4-arm-cortexa8/include -Izmq/utils -Izmq/backend/cython -Izmq/devices -I../platform-phyCORE-AM335x/sysroot-target/usr/include/python3.1/ -I/usr/include/python3.3m -c zmq/backend/cython/_device.c -o build/temp.linux-x86_64-3.3/zmq/backend/cython/_device.o
arm-cortexa8-linux-gnueabihf-gcc: error: unrecognized command line option '-fstack-protector-strong'
arm-cortexa8-linux-gnueabihf-gcc: error: unrecognized command line option '-m64'
arm-cortexa8-linux-gnueabihf-gcc: error: unrecognized argument in option '-mtune=generic'
arm-cortexa8-linux-gnueabihf-gcc: note: valid arguments to '-mtune=' are: arm1020e arm1020t arm1022e arm1026ej-s arm10e arm10tdmi arm1136j-s arm1136jf-s arm1156t2-s arm1156t2f-s arm1176jz-s arm1176jzf-s arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm70 arm700 arm700i arm710 arm7100 arm710c arm710t arm720 arm720t arm740t arm7500 arm7500fe arm7d arm7di arm7dm arm7dmi arm7m arm7tdmi arm7tdmi-s arm8 arm810 arm9 arm920 arm920t arm922t arm926ej-s arm940t arm946e-s arm966e-s arm968e-s arm9e arm9tdmi cortex-a15 cortex-a5 cortex-a7 cortex-a8 cortex-a9 cortex-m0 cortex-m1 cortex-m3 cortex-m4 cortex-r4 cortex-r4f cortex-r5 ep9312 fa526 fa606te fa626 fa626te fa726te fmp626 generic-armv7-a iwmmxt iwmmxt2 mpcore mpcorenovfp native strongarm strongarm110 strongarm1100 strongarm1110 xscale
error: command 'arm-cortexa8-linux-gnueabihf-gcc' failed with exit status 1
(当我运行python3 setupegg.py build bdist_egg
时也会发生同样的情况,但我无论如何都不需要鸡蛋)
因此,出于某种原因,生成的源代码是使用适合我的主机系统但不适合目标编译器的标志构建的:-fstack-protector-strong、-m64和-mtune=generic。 我尝试像提到的那样修改 CFLAGS 和 OPT here但尽管这不起作用,我怀疑这是否是最复杂的方法..
所以问题是:我在这里做错了什么?如何告诉设置过程向交叉编译器提供正确的标志?为什么这个过程似乎适用于 Android-NDK,并且会产生相同的错误?
顺便说一句。我正在开发最近的 Fedora 20/x86_64
最佳答案
替代解决方案
你尝试过吗Buildroot ?它同时提供Python3和zmq。
git clone git://git.buildroot.net/buildroot
cd buildroot
make beaglebone_defconfig
make menuconfig
在菜单中选择外部工具链,在“目标包”下选择Python3和zmq,然后在Python3外部包下选择python-pyzmq。
make
关于python - 使用一些arm-gcc交叉编译PyZMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25287820/