导入我的c++;模块? 我一直致力于在C++中编写Python模块。我有一个C++,可以自己运行。它工作得很好,但我认为如果我能像Python中的函数一样调用它会更好。所以我尽了最大的努力,构建并安装了它。以下是我的模块(称为nnrunner.cpp)的代码:
由于依赖关系,它必须使用导入我的c++;模块? 我一直致力于在C++中编写Python模块。我有一个C++,可以自己运行。它工作得很好,但我认为如果我能像Python中的函数一样调用它会更好。所以我尽了最大的努力,构建并安装了它。以下是我的模块(称为nnrunner.cpp)的代码:,python,c++,Python,C++,由于依赖关系,它必须使用-lglut-lGL-lGLU进行编译,但实际上它没有任何UI。 我可以编译并安装它(python setup.py build,python setup.py install),但当我尝试导入它时,会出现错误: Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 2 2016, 17:53:06) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux Type "help
-lglut-lGL-lGLU
进行编译,但实际上它没有任何UI。
我可以编译并安装它(python setup.py build
,python setup.py install
),但当我尝试导入它时,会出现错误:
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 2 2016, 17:53:06)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import nnrunner
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/justin/anaconda3/lib/python3.5/site-packages/nnrunner.cpython-35m-x86_64-linux-gnu.so: undefined symbol: _ZTVNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE
>>>
Python 3.5.2 | Anaconda 4.2.0(64位)|(默认,2016年7月2日,17:53:06)
linux上的[GCC 4.4.7 20120313(Red Hat 4.4.7-1)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入nnrunner
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:/home/justin/anaconda3/lib/python3.5/site-packages/nnrunner.cpython-35m-x86_64-linux-gnu.so:未定义的符号:_ZTVNSt7__cx1115基本_stringbufIcSt11char_traitssiceee
>>>
有人能给我指一下这方面的文档吗?这是我第一次尝试在C++中制作Python模块。
最有可能意味着你正在导入一个共享库,它有一个与Python分布不兼容的二进制接口。p> 所以在您的例子中:您有一个64位的Python,您正在导入一个32位的库,反之亦然。(或者正如评论中所建议的,使用了不同的编译器)。
对cython模块也有类似的问题。我猜编译器和Anaconda库之间存在不兼容问题通过升级Anaconda
libgcc
包解决了这个问题:conda安装libgcc
或者可能是一个不同的编译器。在OS X上编译C时经常发生这种情况。我知道我有一个64位Python解释器。为了清楚起见,您是说我包含的
可能是32位的,或者其他类似的库是32位的?我该如何计算特定的库是32位还是64位?或者它是用不同于Python构建脚本使用的编译器编译的?@justinrixx否。我是说您使用的编译器生成32位二进制文件。这是一种可能性。另一种可能性是,生成Anaconda可执行文件的编译器与生成lib文件的编译器不同。尝试将库导入Linux发行版附带的标准Python。您使用的是什么Linux发行版?如果是Debian/Ubuntu,请使用sudo安装python3
,然后运行python3
,导入您的模块,看看会发生什么。@quantumphysician是的,我正在使用Ubuntu。当我使用蟒蛇3时,我得到了与我使用蟒蛇时相同的错误。当我运行python setup.py build
时,它运行了一些g++的东西。但是构建的.so
不应该与默认解释器(我认为是Anaconda)的架构相同吗?@justinrixx Anaconda是Python的一个发行版。尝试安装Ubuntu附带的本机Python。老实说,我不明白为什么你会在Ubuntu上需要Anaconda,但无论如何,我们必须确保你明白Anaconda是Python在你的操作系统上的外国发行版,并且可能是用不同的编译器编译的。我需要您尝试在操作系统的本机Python上导入库。它应该位于/usr/bin/Python3
(或类似位置)。
from distutils.core import setup, Extension
module1 = Extension('nnrunner',
sources = ['nnrunner.cpp', 'game.cpp', 'uiDraw.cpp',
'uiInteract.cpp', 'player.cpp', 'ship.cpp', 'network.cpp'],
libraries = ['glut', 'GL', 'GLU'])
setup (name = 'NNRunner',
version = '1.0',
description = 'This is my first package',
ext_modules = [module1])
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 2 2016, 17:53:06)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import nnrunner
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/justin/anaconda3/lib/python3.5/site-packages/nnrunner.cpython-35m-x86_64-linux-gnu.so: undefined symbol: _ZTVNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE
>>>