首页 > 解决方案 > 动态链接到 C++ 静态成员字段时符号查找失败

问题描述

我有以下三个文件:

主.hpp:

class A {
public:
        static int V;
};

主.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. 但是……我们到了。这里发生了什么?我可以解决这个问题,以便在链接中不会出现错误吗?

标签: c++linkershared-libraries

解决方案


-rdynamic正如@LorinczyZsigmond 指出的那样,除非您指定链接器,否则库无法访问主可执行文件中的符号。所以如果你这样做:

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

一切正常。


推荐阅读