У меня странная проблема. Когда я вызываю импортированный метод с аргументами из разделяемой библиотеки, в этом методе у меня неверные аргументы. Это как:
x = 1; y = 2; z = 3;
(*method)(x,y,z);
В методе у меня есть:
void method(int x, int y, int z){
// x = 2, y = 3, z = 32432423 - something like this
}
Вот как я делаю импорт:
QVector<int> (*interpolateValue)( int, int, int );
libHandle = dlopen( "plugins/libinterpolate.so", RTLD_LAZY );
*(void **)(&interpolateValue) = dlsym( libHandle, "_ZN11Interpolate16interpolateValueEiii" );
QVector<int> ys = (*interpolateValue)( lastY, newY, step );
Я решил обойти это так:
QVector<int> (*interpolateValue)( int*, int, int, int );
QVector<int> ys = (*interpolateValue)( NULL, lastY, newY, step );
Но я думаю, что это не средство.
c++filt(1)
говорит:
$ c++filt _ZN11Interpolate16interpolateValueEiii
Interpolate::interpolateValue(int, int, int)
кажется, это указывает на то, что функция, которую вы пытаетесь вызвать, является функцией-членом класса C ++. Это означает, что у него есть неявный первый параметр — this
указатель. Ваш обходной путь исправляет вещи, потому что вы передаете NULL
this
указатель на метод для использования. По-видимому, фактически он вообще не использует этот параметр ..
Если вы не хотите обходить проблему таким образом, измените Interpolate::interpolateValue(int, int, int)
быть свободной функцией вместо метода любого класса, в котором он находится.
Других решений пока нет …