我有以下三个文件:
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
链接应该没有问题。但是...我们来了。这里发生了什么?我可以解决这个问题,以便链接时不会发生错误吗?
答案 0 :(得分:0)
正如@LorinczyZsigmond指出的那样,除非您为链接器指定load_model('model.h5', custom_object={'loss': loss_function})
,否则该库将无法从主可执行文件访问符号。因此,如果您这样做:
-rdynamic
一切正常。