我正在使用distutils来构建用C ++编写的Python扩展模块。我遇到的问题是,为了编译扩展模块,我需要链接某个共享库。这需要设置额外的编译器标志。因此,我搜索了Python文档,并了解了extra_compile_args
对象的Extension
属性。所以我尝试了以下内容:
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中导入我的模块时由于未定义的符号而引发ImportError
异常。所以,显然图书馆没有正确链接。所以我尝试编写一个与共享库链接的丢弃C ++程序,它运行正常。然后我意识到distutils
正在发生一些奇怪的事情,因为如果我添加一个链接到伪造库名称的编译参数,distutils只会编译所有内容而没有问题:
module.extra_compile_args = ['--std=c++0x', '-l some_fake_library'];
当我运行setup.py build
时,构建运行没有错误!
那么,这里发生了什么?如何编译需要链接到共享库的扩展模块?
答案 0 :(得分:5)
实际上有一个特殊的选择。
例如:
libraries=["rt"]
您不用选项和lib部分。
答案 1 :(得分:3)
distutils的目的之一是使您的代码不依赖于单个编译器。你的“-l somelib”看起来似乎与GCC一起工作(即使它应该是“-lsomelib”,没有空间)。这就是您使用libraries
类Extension
选项的原因。然后,Distutils会将相应的链接命令传递给它正在使用的任何编译器。
您还可以查看distutils正在使用的实际构建命令,并自己执行它们以查看出现了什么问题。