У меня есть следующие три файла:
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
.Но все же ... Вот и мы.Что тут происходит?Можно ли это исправить, чтобы не возникало ошибок при линковке?