c++ - 动态链接到 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
. 但是……我们到了。这里发生了什么?我可以解决这个问题,以便在链接中不会出现错误吗?
解决方案
-rdynamic
正如@LorinczyZsigmond 指出的那样,除非您指定链接器,否则库无法访问主可执行文件中的符号。所以如果你这样做:
$ c++ main.cpp -rdynamic -ldl -o main
$ c++ -shared -fpic lib.cpp -o liblib.so
$ ./main
一切正常。
推荐阅读
- javascript - 是否可以从 tronweb 和 Azure 密钥库触发 Tron 智能合约
- mysql - MySQL Select Where Unexpected Results
- c# - C# ASN.1 解码失败
- typescript - 如何在打字稿中创建一个类并动态添加字段?
- javascript - 如何通过 node-rdkafka 传递多个 groupid 和主题对来消费?
- php - Laravel 新增存储日志权限
- javascript - 将中国 MS Azure 认知服务与全球 WEB 服务相结合
- python - 在熊猫中将行转换为正确的数据框
- android - 如何使用支持版本的回收器视图而不是 Androidx
- javascript - Postman 检查 XML 响应包含多个元素和值