C++ 中 dlsym 的未定义符号

Undefined symbol for dlsym in C++

本文关键字:未定义 符号 dlsym C++      更新时间:2023-10-16

我有一个C++程序,我想将其加载到当前正在运行的C++程序中。以下是片段

文件 : a.cpp

#include<bits/stdc++.h>
using namespace std;
void abc() { 
cout << "This is abc" << endl;
}

文件: 主文件.cpp

#include <bits/stdc++.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
system("g++ -fpic -shared -ldl -o a.so a.cpp"); 
void *lib = dlopen("./a.so", RTLD_NOW);
if (!lib) {
printf("dlopen failed: %sn", dlerror());
return 1;
}
void (*f)();
f = (void (*)()) dlsym(lib, "abc");
if (f) {
f();
} else {
printf("dlsym for f1 failed: %sn", dlerror());
}
dlclose(lib);
return 0;
}

我正在使用以下命令进行编译

g++ -w mainFile.cpp -ldl -o mainFile && ./mainFile

输出:

dlsym for f1 failed: ./a.so: undefined symbol: abc

请帮忙。

我正在用 g++ 版本 g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12( 5.4.0 在 Ubuntu 16.04 中编译 20160609

观察奇怪的是,当我将上述 a.cpp 文件作为 a.c 并且只有 stdio.h 作为标头并且还带有 -fallowive 标志时,程序编译并得到输出作为This is abc。我不明白为什么 CPP 版本失败。我无法使用 CPP 的原因(或者更确切地说是犹豫是否要去.C route(是我的项目需要OOPS概念,我必须在库文件中使用类。上面的例子只是为了简化目标。 注意:我遵循了以下参考资料,但没有帮助。

  1. 你能动态编译和链接/加载 C 代码到 C 程序中吗?
  2. 自 Ubuntu 升级以来对"DLOPEN"的未定义引用
  3. C dlsym undefined symbol

在C++名称被破坏,也就是说,库中符号的名称不仅仅是abc。相反,它具有描述该函数的参数等的附加字符(装饰(。这就是为什么您找不到名称为abc的功能的原因。

您有两种选择:

  1. 查找损坏的名称(这可能很困难/不可移植,因为重整取决于编译器(。
  2. 将函数abc()声明为extern "C" { void abc(); }。这会请求函数的 C 链接,从而防止名称重整。

另请参阅您在评论中获得的许多指示。