欢迎使用二维码访问本文:
这两天尝试使用C扩展Python,在Ubuntu下很顺利,无阻碍完成。
在Windows下,我先直接使用VC按某博客上说的做(建一个DLL工程),结果出现一堆的符号找不到:
_imp__Py_BuildValue
但我确定已经把库目录以及包含目录设置正确了。
放弃VC,我用setup.py的方式来编译总可以吧。
结果_imp__xxx这样的符号没问题了,但我使用的另一个库又出问题了,一直提示找不到xx符号:
我确定我已经在setup.py里设置好了相关的lib路径,不应该出现这样的问题啊,我的setup.py内容如下:
from distutils.core import setup,Extension
module1 = Extension(name = 'pyNV',
sources = ['pyNV.c'],
define_macros = [('QLIB_STATIC', None)])
setup(name = 'pyNV', version = '1.0',
description = 'NV operation python extention',
ext_modules = [module1])
代码中也已经添加了相关的lib导入代码:
#include "QLib.h"
#include "QLib_Defines.h"
#pragma comment( lib, "QMSL_MSVC9R.lib" )
结但就是给我提示找不到XX符号,XX符号已经在Qlib.h中定义过了,在lib中也确定是有的,这是怎么回事。。。。
然后Google,Baidu,均无解。。。
然后注意到了setup.py产生的build文件中有这样的内容:lib.amd64-2.7
好像不对劲,我的系统是Win7-64bit,python也是python2.7-amd64,但是QMSL_MSVC9R.lib好像是32位版本啊,靠,困扰了我两天的问题难道就是这样???
果断卸载python2.7-amd64版本,重新下载了一个python2.7的32bit版本,然后再次运行python setup build,成功!
C:\Users\Administrator\Desktop\pyNV>python setup.py build
running build
running build_ext
building 'pyNV' extension
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -DQLIB_STATIC -IC:
\Python27\include -IC:\Python27\PC /TcpyNV.c /Fobuild\temp.win32-2.7\Release\pyNV.obj
pyNV.c
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:C:\Python27\lib
s /LIBPATH:C:\Python27\PCbuild /EXPORT:initpyNV build\temp.win32-2.7\Release\pyNV.obj /OUT:build\lib.win32-2.7\pyNV.pyd
/IMPLIB:build\temp.win32-2.7\Release\pyNV.lib /MANIFESTFILE:build\temp.win32-2.7\Release\pyNV.pyd.manifest
正在创建库 build\temp.win32-2.7\Release\pyNV.lib 和对象 build\temp.win32-2.7\Release\pyNV.exp
看来确实就是库不兼容的问题所导致的找不到符号错误。
各位使用setup.py编译时,可以看看编译命令,如果使用的是64bit的编译器,产生的64bit的扩展,则你的C程序所调用的库文件也应该是64bit才对,至于能不能调用32bit,我就没时间去深究了。
希望这点信息能帮到同样迷惑的你。