使用distutils构建Python扩展模块 我用ditudil构建了一个用C++编写的Python扩展模块。我遇到的问题是,为了编译扩展模块,我需要与某个共享库链接。这需要设置一个额外的编译器标志。因此,我搜索了Python文档,找到了扩展对象的额外编译参数属性。因此,我尝试了以下方法: from distutils.core import setup, Extension module = Extension('test', sources = ['test.cpp']) module.extra_compile_args = ['--std=c++0x', '-l mylib']; setup(name = 'test', version = '1.0', ext_modules = [module])
这似乎是在编译,除非我在Python中导入模块时,由于未定义的符号,它会抛出一个使用distutils构建Python扩展模块 我用ditudil构建了一个用C++编写的Python扩展模块。我遇到的问题是,为了编译扩展模块,我需要与某个共享库链接。这需要设置一个额外的编译器标志。因此,我搜索了Python文档,找到了扩展对象的额外编译参数属性。因此,我尝试了以下方法: from distutils.core import setup, Extension module = Extension('test', sources = ['test.cpp']) module.extra_compile_args = ['--std=c++0x', '-l mylib']; setup(name = 'test', version = '1.0', ext_modules = [module]),c++,python,gcc,distutils,C++,Python,Gcc,Distutils,这似乎是在编译,除非我在Python中导入模块时,由于未定义的符号,它会抛出一个ImportError异常。所以,显然图书馆没有正确链接。所以我尝试编写一个与共享库链接的丢弃的C++程序,运行良好。然后我意识到,distutils发生了一些非常奇怪的事情,因为如果我添加一个链接到伪库名的compile参数,distutils就可以毫无问题地编译所有内容: module.extra_compile_args = ['--std=c++0x', '-l some_fake_library']; 当
ImportError
异常。所以,显然图书馆没有正确链接。所以我尝试编写一个与共享库链接的丢弃的C++程序,运行良好。然后我意识到,distutils
发生了一些非常奇怪的事情,因为如果我添加一个链接到伪库名的compile参数,distutils就可以毫无问题地编译所有内容:
module.extra_compile_args = ['--std=c++0x', '-l some_fake_library'];
当我运行setup.py build
时,生成运行时没有错误
那么,这是怎么回事?如何编译需要链接到共享库的扩展模块?实际上有一个特殊的选项 例如:
libraries=["rt"]
您取消了选项和库部分 distutils的目的之一是使代码不依赖于单个编译器。您的“-l somelib”看起来应该与GCC一起使用(即使它应该是“-lsomelib”,没有空间)。这就是为什么要对
扩展
类使用库
选项的原因。Distutils然后将适当的link命令传递给它使用的任何编译器
您还可以查看distutils正在使用的实际构建命令,并亲自执行这些命令,以查看出了什么问题