Неправильная позиция аргументов в функции, импортированной с помощью dlsym

У меня странная проблема. Когда я вызываю импортированный метод с аргументами из разделяемой библиотеки, в этом методе у меня неверные аргументы. Это как:

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

Но я думаю, что это не средство.

2

Решение

c++filt(1) говорит:

$ c++filt _ZN11Interpolate16interpolateValueEiii
Interpolate::interpolateValue(int, int, int)

кажется, это указывает на то, что функция, которую вы пытаетесь вызвать, является функцией-членом класса C ++. Это означает, что у него есть неявный первый параметр — this указатель. Ваш обходной путь исправляет вещи, потому что вы передаете NULL this указатель на метод для использования. По-видимому, фактически он вообще не использует этот параметр ..

Если вы не хотите обходить проблему таким образом, измените Interpolate::interpolateValue(int, int, int) быть свободной функцией вместо метода любого класса, в котором он находится.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]