我正在尝试编写一个脚本来自动化python中的设备。该设备是用C编程的,我现在正在尝试编写一个C包装器,以便我稍后从Python调用这些函数。我正在关注this教程。
原始C函数隐藏在.lib文件中,但提供了包含所有函数初始化的头文件。这是一个看起来像什么的片段
#ifdef VNX_ATTEN_EXPORTS
#define VNX_ATTEN_API __declspec(dllexport)
#else
#define VNX_ATTEN_API __declspec(dllimport)
#endif
VNX_ATTEN_API void fnLDA_SetTestMode(bool testmode);
VNX_ATTEN_API int fnLDA_GetNumDevices();
VNX_ATTEN_API int fnLDA_GetDevInfo(DEVID *ActiveDevices);
VNX_ATTEN_API int fnLDA_GetModelName(DEVID deviceID, char *ModelName);
VNX_ATTEN_API int fnLDA_InitDevice(DEVID deviceID);
VNX_ATTEN_API int fnLDA_CloseDevice(DEVID deviceID);
VNX_ATTEN_API int fnLDA_GetSerialNumber(DEVID deviceID);
VNX_ATTEN_API int fnLDA_GetDeviceStatus(DEVID deviceID);
这是我正在尝试创建的C包装器
#include <stdio.h>
#include <Python.h>
extern "C" {
#include "VNX_atten.h"
}
//#include <stdafx.h>
/*
* Function to be called from Python
*/
extern "C" {
static PyObject* py_fnLDA_SetTestMode(PyObject* self, PyObject* args)
{
double x;
double y = 1;
PyArg_ParseTuple(args, "d", &x);
if(x==1)
fnLDA_SetTestMode(true);
else
fnLDA_SetTestMode(false);
return Py_BuildValue("d", y);
}
/*
* Another function to be called from Python
*/
static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
double x, y;
PyArg_ParseTuple(args, "dd", &x, &y);
return Py_BuildValue("d", x*y);
}
/*
* Bind Python function names to our C functions
*/
static PyMethodDef myModule_methods[] = {
{"fnLDA_SetTestMode", py_fnLDA_SetTestMode, METH_VARARGS},
{"myOtherFunction", py_myOtherFunction, METH_VARARGS},
{NULL, NULL}
};
/*
* Python calls this to let us initialize our module
*/
void initmyModule()
{
(void) Py_InitModule("myModule", myModule_methods);
}
}
我正在尝试的编译调用是
g ++ -shared -IC:/ Python27 / include -LC:/ Python27 / libs myModule.cpp -lpython27 -o myModule.pyd
根据我的搜索,我在SO上发现了this问题,并尝试了这一点 gcc -shared -IC:/ Python27 / include -LC:/ Python27 / libs myModule.c -DVNX_ATTEN_EXPORTS = 1 -lpython27 -o myModule.pyd
没有帮助。
我收到错误“错误的reloc地址0x0 in section .data”“collect2.exe:error:ld返回1退出状态”
编译是在使用MinGW库和Python 2.7的Windows XP(32位)平台上进行的。
如果您需要任何进一步的信息,请提前告知我们! PS:这是否算作交叉编译?
编辑:添加整个错误消息
C:\cygwin\home\VRaghu\Attenuator\LDA SDK\ANSI C SDK\VNX_Atest>g++ -shared -IC:/P
ython27/include -LC:/Python27/libs myModule.cpp -DVNX_ATTEN_EXPORTS=1 -lpython27
-o myModule.pyd
C:\DOCUME~1\VRaghu\LOCALS~1\Temp\ccFkPRnf.o:myModule.cpp:(.text+0x40): undefined
reference to `fnLDA_SetTestMode'
C:\DOCUME~1\VRaghu\LOCALS~1\Temp\ccFkPRnf.o:myModule.cpp:(.text+0x50): undefined
reference to `fnLDA_SetTestMode'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\DOCUME~
1\VRaghu\LOCALS~1\Temp\ccFkPRnf.o: bad reloc address 0x0 in section `.data'
collect2.exe: error: ld returned 1 exit status
答案 0 :(得分:8)
您必须使用g++ ... -llibraryName
链接lib文件。