Я пытаюсь загрузить TestCode.so с помощью dlopen. getNumber() — это функция, которую я хочу использовать из TestCode.so. Но когда я загружаю .so. Я не могу использовать функцию. Это дает ошибку сегментации.
Пример программы: TestHeader.hpp
#ifndef _HEADER_HPP
#define _HEADER_HPP
typedef struct
{
int number;
} Test;
#endif
TestCode.cpp
#include "TestHeader.hpp"
extern "C" void getNumber( Test* tObj, int number)
{
tObj->number = number;
}
main.cpp
#include "TestHeader.hpp"
#include <iostream>
#include <dlfcn.h>
#include <stdio.h>
int main() {
using std::cout;
using std::cerr;
Test* tMainObj = NULL;
typedef int (*TestNumber)(Test*, int);
void* thandle = dlopen("./TestCode.so", RTLD_LAZY);
if (!thandle) {
cerr << "Cannot load TestCode: " << dlerror() << '\n';
return 1;
}
// reset errors
dlerror();
// load the symbols
TestNumber getAge = (TestNumber) dlsym(thandle, "getNumber");
const char* dlsym_error = dlerror();
if (dlsym_error) {
cerr << "Cannot load symbol getNumber: " << dlsym_error << '\n';
return 1;
}
printf("Getting my age\n");
int myAge = 25;
getAge(tMainObj,myAge);
printf("My age from the so is: %d\n",tMainObj->number);
dlclose(thandle);
}
Выход:
Получение ошибки сегментации моего возраста (дамп ядра)
Для компиляции и создания общей библиотеки. Я использовал следующую команду,
g++ -fPIC -c -Wall TestHeader.hpp
g++ -fPIC -c -Wall TestCode.cpp
g++ -shared TestCode.o -o TestCode.so
g++ -fPIC -c -Wall main.cpp
g++ main.cpp -o main TestCode.o -ldl
Может ли кто-нибудь помочь мне понять эту часть? Заранее спасибо.
int
, а функцияvoid
? - person Quimby   schedule 25.06.2019