Вызов c++ из python с использованием ctypes: g++ undefined reference

У меня есть Camera (thorlabs dcc1645c), который поставляется с "uc480.h" + "uc480.lib", чтобы запрограммировать его с помощью c++. Моя проблема в том, что мне нужно использовать камеру с Python, поэтому я попытался назвать класс c++ с Python, как сказал Флориан:

Вызов C/c++ из 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 ответа

Я работаю из памяти; может быть достаточно просто добавить файл lib в команду link, как в

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

Или вам может понадобиться добавить такой параметр, как -L. -Luc480 -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)

  1. В строке меню выберите "Файл", "Создать", "Проект".

  2. В левой панели диалогового окна "Новый проект" разверните узел "Установленные", "Шаблоны", "Визуальный" c++, а затем выберите "Win32".

  3. В центральной области выберите Win32 Console Application.

  4. Укажите имя решения - например, MyDLL - в поле Имя решения. Выберите кнопку "ОК".

  5. На странице "Обзор" диалогового окна "Мастер приложений Win32" нажмите кнопку "Далее".

  6. На странице "Параметры приложения" в разделе "Тип приложения" выберите "DLL".

  7. Нажмите кнопку "Готово", чтобы создать проект.

После этого я добавил код c++ в MyDLL.cpp и скомпилирован для получения MyDLL.dll. Это можно использовать с типами python:

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()

Это отлично работает для меня.

licensed under cc by-sa 3.0 with attribution.