LINUX.ORG.RU

libdl и обратные ссылки

 ,


0

3

Что нужно: Программа A, которая загружает (через libdl) библиотеку B. Библиотека B использует функции и классы программы A.

Что есть: libtest.so: undefined symbol: _ZN4Test4testEv.

main.cpp:

#include <iostream>
#include <dlfcn.h>
#include "main.hpp"

int main() {
    void *h = dlopen("libtest.so", RTLD_NOW);
    if (h == nullptr){
        std::cerr << dlerror() << std::endl;
        return 1;
    }

    void *s = dlsym(h, "lib_main");
    if (s == nullptr){
        std::cerr << dlerror() << std::endl;
        return 1;
    }

    ((void(*)()) s)();

    dlclose(h);
    return 0;
}

void Test::test() {
    std::cout << "Test::test()" << std::endl;
}

main.hpp:

class Test {
public:
    void test();
};

lib.cpp:

#include "main.hpp"

void lib_main(){
    Test test{};
    test.test();
}

Компилирую:

g++ main.cpp -o main -ldl
g++ -shared lib.cpp -o libtest.so

Если я ничего не путаю, то твой libtest сделал своё имя для Test::test метода (и класса) и ничего не знает про класс Test из main.

С ходу вижу два варианта:

1) libtest должна принимать не класс, а extern «C» функцию в виде указателя, которую и будет дёргать в lib_main.

2) В libtest определнить интерфейс объекта с методом test. Например, ITest. Который ты будешь дёргать в lib_main. А в main сделать наследника от ITest, где перегрузить ITest::test метод.

Norgat ★★★★★ ()

вынести Test в отдельную либу - не вариант?

conalex ★★★ ()

Когда компилируешь программу, передавай -rdynamic при линковке

annulen ★★★★★ ()
Ответ на: комментарий от annulen

О, надо же, живой человек, который умеет в ABI и компоновку.

intelfx ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.