首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ctype从python调用c++:g++未定义的引用

使用ctype从python调用c++:g++未定义的引用
EN

Stack Overflow用户
提问于 2014-04-22 15:48:31
回答 2查看 858关注 0票数 0

我有一个相机(thorlabs dcc1645c),它带有一个"uc480.h“+ "uc480.lib”来用c++对它进行编程。我的问题是我需要在Python中使用相机,所以我试着用Python调用一个C++类,就像弗洛里安告诉我的那样:

Calling C/C++ from python?

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

代码语言:javascript
运行
复制
\#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++编译:

代码语言:javascript
运行
复制
g++  -fPIC -c Cam2.cpp -o Cam2.o
g++  -shared -Wl,-soname,libCam2.so -o libCam2.so  Cam2.o

第二行给出一个错误:

代码语言:javascript
运行
复制
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相机。

EN

回答 2

Stack Overflow用户

发布于 2014-04-22 16:02:44

我是在内存中工作;只需将lib文件添加到link命令就足够了,如下所示

代码语言:javascript
运行
复制
g++  -shared -Wl,-soname,libCam2.so -o libCam2.so uc480.lib Cam2.o

或者,您可能需要在链接命令中添加一个像-L. -luc480这样的选项,假设库与代码在同一目录中。

票数 0
EN

Stack Overflow用户

发布于 2014-04-25 16:14:34

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

代码语言:javascript
运行
复制
#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. 在新建项目对话框的左窗格中,展开已安装、模板、可视C++,然后选择Win32。
  3. 在中间窗格中,在解决方案名称框中选择Win32 Console为解决方案命名-例如,MyDLL。选择“确定”按钮。
  4. 在“Win32应用程序向导”对话框的“概述”页上,选择“下一步”按钮。
  5. 在“应用程序设置”页上的“应用程序类型”下,选择“DLL”。
  6. 选择“完成”按钮创建项目。

之后,我将我的c++代码添加到MyDLL.cpp中,并编译得到MyDLL.dll,这可以与python ctype一起使用:

代码语言:javascript
运行
复制
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()

这对我来说很好。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23213605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档