使用ctypes从python调用c ++:g ++ undefined reference

时间:2014-04-22 07:48:31

标签: python c++ g++ ctypes

我有一台带有“uc480.h”+“uc480.lib”的相机(thorlabs dcc1645c)用c ++编程。我的问题是我需要使用Camera with Python,所以我试图用Florian告诉Python的C ++类:

Calling C/C++ from python?

这是我的c ++代码(Cam2.cpp):

\#include "uc480.h"
class Cam{
public:
    UC480_CAMERA_LIST* pucl;
    int nNumberOfCameras;
    int GetNumberOfCameras(){
        return is_GetNumberOfCameras(&nNumberOfCameras);
    }   
};
extern "C" {
    Cam* Cam_new(){ return new Cam(); }
    int  Cam_GetNumberOfCameras(Cam* cam){ cam->GetNumberOfCameras(); }
}

我尝试用g ++编译:

g++  -fPIC -c Cam2.cpp -o Cam2.o
g++  -shared -Wl,-soname,libCam2.so -o libCam2.so  Cam2.o

第二行出错:

Cam2.o:Cam2.cpp:(.text$_ZN3Cam18GetNumberOfCamerasEv[Cam::GetNumberOfCameras()]+
0x1a): undefined reference to `__imp_is_GetNumberOfCameras'
collect2.exe: error: ld returned 1 exit status

'is_GetNumberOfCameras'在“uc480.lib”中定义,所以我认为链接存在问题。我该如何解决?

请告诉我,如果您现在可以使用相机与Python的其他可能性。

2 个答案:

答案 0 :(得分:0)

我在记忆中工作;简单地将lib文件添加到link命令就足够了,如

g++  -shared -Wl,-soname,libCam2.so -o libCam2.so uc480.lib Cam2.o

或者,您可能需要在link命令中添加-L. -luc480之类的选项,假设该库与代码位于同一目录中。

答案 1 :(得分:-1)

到目前为止,感谢您的帮助。我找到了解决问题的方法。首先,这是我目前的c ++代码:

#include "uc480.h" 
class Cam{
public:
    UC480_CAMERA_LIST* pucl = 0;
    int nNumberOfCameras;   
    int GetNumberOfCameras(){
        return is_GetNumberOfCameras(&nNumberOfCameras);
    }

extern "C"{
    __declspec(dllexport) Cam* Cam_New() { return new Cam(); }
    __declspec(dllexport) int Cam_GetNumberOfCameras(Cam* obj){ return obj->GetNumberOfCameras(); }
     }

我使用Visual Studio构建DLL。我按照本指令的第一步http://msdn.microsoft.com/de-de/library/ms235636.aspx

创建动态链接库(DLL)项目

  1. 在菜单栏上,选择“文件”,“新建”,“项目”。

  2. 在“新建项目”对话框的左窗格中,展开“已安装”,“模板”,“Visual C ++”,然后选择“Win32”。

  3. 在中心窗格中,选择“Win32控制台应用程序”。

  4. 在“解决方案名称”框中指定解决方案的名称 - 例如,MyDLL。选择确定按钮。

  5. 在Win32 Application Wizard对话框的Overview页面上,选择Next按钮。

  6. 在Application Settings页面的Application type下,选择DLL。

  7. 选择“完成”按钮以创建项目。

  8. 之后我将我的c ++代码添加到MyDLL.cpp并编译以获取MyDLL.dll 这可以与python ctypes一起使用:

    from ctypes import cdll
    lib = cdll.LoadLibrary("PathToLib\MyDLL.dll")
    class Camera(object):
        def __init__(self):
            self.obj = lib.Cam_New()
        def GetNumberOfCameras(self):
            return lib.Cam_GetNumberOfCameras(self.obj)
    MyCam = Camera()
    Numbers = MyCam.GetNumberOfCameras()
    

    这对我来说很好。