C++ 中 dlsym 的未定义符号
Undefined symbol for dlsym in C++
我有一个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概念,我必须在库文件中使用类。上面的例子只是为了简化目标。 注意:我遵循了以下参考资料,但没有帮助。
- 你能动态编译和链接/加载 C 代码到 C 程序中吗?
- 自 Ubuntu 升级以来对"DLOPEN"的未定义引用
- C dlsym undefined symbol
在C++名称被破坏,也就是说,库中符号的名称不仅仅是abc
。相反,它具有描述该函数的参数等的附加字符(装饰(。这就是为什么您找不到名称为abc
的功能的原因。
您有两种选择:
- 查找损坏的名称(这可能很困难/不可移植,因为重整取决于编译器(。
- 将函数
abc()
声明为extern "C" { void abc(); }
。这会请求函数的 C 链接,从而防止名称重整。
另请参阅您在评论中获得的许多指示。
相关文章:
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++ 中 dlsym 的未定义符号
- 仅在 MacOS 上析构函数的未定义符号
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 生成文件:体系结构x86_64的未定义符号
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- Xcode"体系结构x86_64的未定义符号"
- 体系结构x86_64的未定义符号:找不到原因
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 监视 SDK 下的未定义符号"__Unwind_SjLj_Unregister"
- 使用 Boost/Python 的未定义符号 - 复杂
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自: