2011-04-22 130 views
4

我使用distutils构建用C++编写的Python扩展模块。我遇到的问题是,为了编译扩展模块,我需要链接一个特定的共享库。这需要设置一个额外的编译器标志。因此,我通过Python文档搜索并找出Extension对象的extra_compile_args属性。所以,我试过如下:使用distutils构建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它抛出一个异常ImportError由于未定义的符号。所以,显然图书馆没有正确链接。所以我试着写了一个与共享库链接的C++程序,它运行良好。然后我意识到事情非常奇怪的是怎么回事distutils,因为如果我添加一个链接到一个假的库名编译参数,distutils的只是编译一切都没有问题:

module.extra_compile_args = ['--std=c++0x', '-l some_fake_library']; 

当我运行setup.py build,构建运行没有错误!

那么,这是怎么回事?我如何编译需要链接到共享库的扩展模块?

回答

5

实际上有一个特殊的选择。

例如:

libraries=["rt"] 

你离开关闭该选项和lib部分。

3

distutils的目的之一是使您的代码不依赖于单个编译器。你的“-l somelib”看起来像是用于GCC(尽管它应该是“-lsomelib”,没有空格)。这就是为什么您使用Extension类的libraries选项。然后Distutils将相应的链接命令传递给它正在使用的任何编译器。

您还可以查看distutils正在使用的实际构建命令,并自己执行它们以查看发生了什么问题。