Swig с cmake и дополнительными библиотеками - PullRequest
2 голосов
/ 01 марта 2012

Я работаю над проектом, в котором я хочу использовать библиотеку C ++ в Python.После небольшого исследования я понял, что Swig был бы хорошим способом сделать это (небольшой пример сработал).

Так что теперь я пытаюсь включить Swig в cmake, чтобы сделать вещи более удобными.

В моем случае у меня есть действительно небольшая программа для тестирования:

#include "ct.h"
using namespace std;

int main(int argc, char const *argv[])
{
    /* code */
    return 0;
}

int test()
{
    Image image(10,11);
    cout << "hallo"<< endl;

    return 3;
}

Класс Image определен в заголовке "image.h", который включен в "ct.час".Это, вероятно, проблема здесь, так как библиотека, которая включает в себя класс Image, должна быть связана с библиотекой, которая генерируется Swig.Я не уверен в этом ... И, особенно, я не знаю, как это сделать.Я не смог ничего найти в руководстве.

В любом случае, если я хочу включить библиотеку в python, я получаю следующую ошибку:

>>> import kissCT
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "kissCT.py", line 25, in <module>
    _kissCT = swig_import_helper()
  File "kissCT.py", line 21, in swig_import_helper
    _mod = imp.load_module('_kissCT', fp, pathname, description)
ImportError: ./_kissCT.so: undefined symbol: _ZN5ImageC1Eii

Связанный файл Swig выглядит следующим образом:

/* kissCT test module */

%module kissCT
%{
#import "ct.h"
extern int test();
%}
extern int test();

IНадеюсь, все это не сбивает с толку, и я был бы очень признателен, если бы кто-то понял, что я сделал не так.

Редактировать: связанный файл cmake выглядит как this

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Python должен уметь находить библиотеку изображений во время выполнения. Самый простой способ - установить переменную среды LD_LIBRARY_PATH в папку, содержащую файл .so изображения, который содержит неопределенный символ.

Если вы запустите команду "ldd _kissCT.so", она должна показать вам библиотеки, от которых она зависит.

0 голосов
/ 07 января 2017

На самом деле, поскольку неразрешенный символ был искажен в C ++, это означает, что отсутствует следующая опция компоновщика:

-lstdc++
...