Ошибка поиска символа при динамическом соединении с полем статического члена c ++ - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующие три файла:

main.hpp:

class A {
public:
        static int V;
};

main.cpp:

#include "main.hpp"

#include <dlfcn.h>
#include <iostream>

using namespace std;

int A::V = 34;

int main() {
        void* handle = dlopen("./liblib.so", RTLD_NOW);
        cout << dlerror() << endl;
        return 0;
}

lib.cpp:

#include "main.hpp"

int f() {
        return A::V;
}

И результат результирующего выполнения:

$ c++ main.cpp -ldl -o main
$ c++ -shared -fpic lib.cpp -o liblib.so
$ ./main
./liblib.so: undefined symbol: _ZN1A1VE
$ nm main | grep _ZN1A1VE
0000000000601070 D _ZN1A1VE
$ nm liblib.so | grep _ZN1A1VE
                 U _ZN1A1VE

nm говорит мне, что _ZN1A1VE имеет внешнюю связь, следовательно, заглавная буква D, а не строчная.Поэтому у liblib.so не должно быть проблем, связанных с A::V.Но все же ... Вот и мы.Что тут происходит?Можно ли это исправить, чтобы не возникало ошибок при линковке?

1 Ответ

0 голосов
/ 21 января 2019

Как отметил @LorinczyZsigmond, библиотека не может получить доступ к символам из основного исполняемого файла, если вы не укажете компоновщик -rdynamic.Так что если вы сделаете это:

$ c++ main.cpp -rdynamic -ldl -o main
$ c++ -shared -fpic lib.cpp -o liblib.so
$ ./main

Все отлично работает.

...