使用ctypes:g++未定义引用从python调用c++
Calling c++ from python using ctypes: g++ undefined reference
我有一台相机(thorlabs dcc1645c),它附带了一个"uc480.h"+"uc480.lib",可以用c++编程。我的问题是我需要将Camera与Python一起使用,所以我试着用Python调用C++类,正如Florian所说:
从python调用C/C++?
这是我的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相机。
我在内存中工作;只需将lib文件添加到链接命令中就足够了,就像在中一样
g++ -shared -Wl,-soname,libCam2.so -o libCam2.so uc480.lib Cam2.o
或者,您可能需要在link命令中添加一个类似-L. -luc480
的选项,假设库与代码位于同一目录中。
感谢您迄今为止的帮助。我找到了解决问题的办法。首先这里是我当前的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)项目
在菜单栏上,选择"文件"、"新建"、"项目"。
在"新建项目"对话框的左侧窗格中,展开"已安装"、"模板"、"Visual C++",然后选择"Win32"。
在中央窗格中,选择Win32控制台应用程序。
在"解决方案名称"框中指定解决方案的名称,例如MyDLL。选择"确定"按钮。
在"Win32应用程序向导"对话框的"概述"页面上,选择"下一步"按钮。
在"应用程序设置"页面的"应用程序类型"下,选择"DLL"。
选择"完成"按钮以创建项目。
之后,我将我的c++代码添加到MyDLL.cpp中,并进行编译以获得MyDLL.dll这可以与python ctypes:一起使用
from ctypes import cdll
lib = cdll.LoadLibrary("PathToLibMyDLL.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()
这对我来说很好。
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 为什么我无法打开/读取从 Python 调用的 C 扩展名中的 txt 文件?
- 从 Python 调用 c++ 文件
- 如何为从 Python 调用C++启动 GDB?
- 从python调用C++函数,使用cython,使用cythonize
- 为什么在 2019 年我们仍然不能使用 ctypes 从 Python 调用C++?
- 如何使用 python 调用 c++ 函数
- 从 Python 调用 Windows DLL 函数时出错
- 如何从 Python 调用 MPI .so 文件
- 我如何有boost.python调用一个函数来处理对象
- 从Python调用的C++dll
- 通过嵌入式 Python 调用C++代码
- 从 Python 调用 cpp 函数时出现分段错误
- 从Python调用C++64位共享库
- 使用ctypes从Python调用C++方法不起作用
- Boost python,在嵌入时从python调用c ++函数
- 从 Python 调用 C++ opencv 函数(发送一个 cv :: mat 到 C++ 使用 opencv 的 d
- 从 Python 调用自定义C++ dll
- 如何使用Python调用C++代码