动态链接到C ++静态成员字段时的符号查找失败

时间:2019-01-21 08:17:26

标签: c++ linker shared-libraries

我有以下三个文件:

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.soA::V链接应该没有问题。但是...我们来了。这里发生了什么?我可以解决这个问题,以便链接时不会发生错误吗?

1 个答案:

答案 0 :(得分:0)

正如@LorinczyZsigmond指出的那样,除非您为链接器指定load_model('model.h5', custom_object={'loss': loss_function}) ,否则该库将无法从主可执行文件访问符号。因此,如果您这样做:

-rdynamic

一切正常。