构建Python C扩展时未解析的外部符号
我现在正在Windows上尝试构建一个C扩展。出现的错误似乎是因为找不到python27.dll中的“标准”符号。我该如何解决这些缺失的符号呢?我需要告诉编译器去哪里找python27.dll,还是说我的python27.lib有问题?
我的环境设置如下:
- Windows 7 64位
- Python 2.7.4
- Numpy 1.7
- Swig 2.0.9
- Visual Studio 9.0
我找到一个链接,似乎有类似的问题,但涉及的版本不是我在用的:http://bugs.python.org/issue15772
我正在运行 python setup.py build_ext --inplace
来构建扩展。
setup.py 文件看起来是这样的:
try:
numpy_include = numpy.get_include()
except AttributeError:
numpy_include = numpy.get_numpy_include()
fmm3d_module = Extension('_fmm3d', sources=['fmm3d.i', 'fmm3d.c'],
include_dirs = [numpy_include])
一切编译都很顺利,然后运行以下链接命令:
C:\Program Files (x86)\Microsoft Visual Studio 9.\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:C:\Python27\libs /LIBPATH:C:\Python27\PCbuild\ amd64 /EXPORT:init_fmm3d build\temp.win-amd64-2.7\Release\fmm3d_wrap.obj build\temp.win-amd64-2.7\Release\fmm3d.obj /OUT:C:\Users\luke\Documents\Ranking\code\_fmm3d.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\_fmm3d.lib /MANIFESTFILE:build\temp.win-amd64-2.7\Release\_fmm3d.pyd.manifest
我遇到了与Python符号相关的链接错误,像下面这样:
fmm3d_wrap.obj : error LNK2019: unresolved external symbol __imp__PyString_AsString referenced in function _SWIG_Python_str_AsChar
fmm3d_wrap.obj : error LNK2019: unresolved external symbol __imp__PyString_FromString referenced in function _SWIG_Python_str_FromChar
fmm3d_wrap.obj : error LNK2019: unresolved external symbol __imp__PyExc_RuntimeError referenced in function _SWIG_Python_ErrorType
fmm3d_wrap.obj : error LNK2019: unresolved external symbol __imp__PyExc_AttributeError referenced in function _SWIG_Python_ErrorType
我找到了Python的库文件,位于C:Python27\libs\python27.lib。我假设这些符号应该在这里。实际上,这个文件中似乎确实有提到这些符号。例如,运行 dumpbin -headers C:\Python27\libs\python27.lib
显示了以下片段:
Version : 0
Machine : 8664 (x64)
TimeDateStamp: 5160619D Sat Apr 06 12:55:41 2013
SizeOfData : 0000001F
DLL name : python27.dll
Symbol name : PyString_AsString
Type : code
Name type : name
Hint : 629
Name : PyString_AsString
这让我相信,python27.lib中提到的PyString_AsString的引用是在python27.dll中。
我是不是漏掉了什么命令行参数来定位这些符号呢?
1 个回答
12
命令行上应该有一个叫做 python27.lib 的文件。你的 dumpbin 显示你安装的 Python 是 64 位的,可能你的 VC++ 编译器是 32 位的。