Cython嵌入错误

时间:2017-07-04 10:12:41

标签: cython python-3.6

我正在尝试在Raspberry Pi 3上使用Cython作为Python 3.6.1应用程序(在Ubuntu Mate 16.04.2下)。

转换子模块(并保留main.py)可以正常工作:

python3.6 -m cython sub.py
gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/local/include/python3.6m -s -o sub.so sub.c
strip sub.so

sub.so可以在没有问题的情况下从main.py中使用。

但转换main.py不会:

python3.6 -m cython --embed main.py
gcc -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/local/include/python3.6m -o main main.c  -L/usr/local/lib  -lpython3.6m -lpthread -lm -lutil -ldl 

主要生成。

但执行它会产生:

Traceback (most recent call last):
File "main.py", line 8, in init main (main.c:6814)
import math
ImportError: /usr/local/lib/python3.6/lib-dynload/math.cpython-36m-arm-linux-gnueabihf.so: undefined symbol: PyLong_FromDouble

删除main.py中的数学导入会导致其他符号出现类似问题。

缺少什么?

1 个答案:

答案 0 :(得分:0)

“PyLong_FromDouble”函数位于“libpython3。*。a”存档中。如果您将运行Python解释器的主可执行文件链接到此静态库,则必须确保: 1)不删除此函数的代码,并且 2)导出符号。

对于1),尝试“--whole-archive”链接器选项,或者只是将“.a”文件放在“.o”而不是将其称为带有“-l”的库。 对于2),尝试使用“-E”(或“--export-dynamic”)链接器选项导出所有符号,因为无论如何它们在“libpython3。*。a”中有很多。