Итак, у меня есть следующий пример, который я пытаюсь запустить.
header.h
extern "C" {
void registerfunc();
};
main.cpp
#include "header.h"
#include <dlfcn.h>
#include <iostream>
using namespace std;
typedef void (*register_func)();
void registerfunc() {
cout << "register func has been called" << endl;
}
int main() {
void* lib_handle = dlopen("./test/test.so", RTLD_NOW | RTLD_GLOBAL);
if(lib_handle == NULL){
cout << "no such lib:" << dlerror() <<endl;
return 0;
}
register_func reg = (register_func)dlsym(lib_handle, "test");
if(reg == NULL){
cout << "Cannot load symbol" << dlerror() << endl;;
} else {
reg();
}
return 0;
}
он скомпилирован с помощью следующего make-файла
all:
g++ main.cpp -ldl
Затем я хочу использовать registerfunc из своего собственного, так что это написано следующим образом:
main.h:
extern "C"
{
void test();
};
main.cpp
#include "main.h"
#include "../header.h"
void test() {
registerfunc();
}
Makefile:
all:
g++ main.cpp -fPIC -shared -o test.so
Когда я компилирую его таким образом и запускаю a.out (вывод первого main), я получаю:
no such lib: ./test/test.so: undefined symbol: registerfunc
Однако, если я скомпилирую a.out и test.so, используя следующие команды:
a.out -> g++ -g -fPIC -shared main.cpp -ldl
test.so -> g++ -g main.cpp -fPIC -shared -o test.so ../a.out
то я получаю ошибку сегментации со следующей трассировкой (gdb -ex run a.out):
0x0000000000000001 in ?? ()
Это ставит меня в тупик относительно того, как make test.so вызывает то, что определено вызываемым объектом. Не могли бы вы помочь?