当前位置: 技术问答>linux和unix
dlopen 相关编译链接解惑
来源: 互联网 发布时间:2016-11-21
本文导语: 为了可以动态加载so,使用了dlopen和dlsym函数。使用时出现了如下情况: test_dlopen.cpp文件中通过dlopen加载test_module.cpp生成的test_module.so。 这里有个要求是test_module.cpp中调用了test_dlopen.cpp中的一个类。 先列出三个文件...
为了可以动态加载so,使用了dlopen和dlsym函数。使用时出现了如下情况:
test_dlopen.cpp文件中通过dlopen加载test_module.cpp生成的test_module.so。
这里有个要求是test_module.cpp中调用了test_dlopen.cpp中的一个类。
先列出三个文件和g++命令.
1 test_dlopen.h
2 test_dlopen.cpp
g++编译命令:g++ -o test_dlopen -ldl test_dlopen.cpp
3 test_module.cpp
g++编译命令:g++ -o test_module.so -shared -fPIC test_module.cpp
这两个命令都可以编译链接过去。
但是在运行./test_dlopen的时候出错:dlopen error error=./test_module.so: undefined symbol: _ZN1A5helloEv
后来重新编译生成test_module.so : g++ -o test_module.so -shared -fPIC test_module.cpp test_dlopen.cpp
成功运行。
我不明白这里面的原因,请大家帮忙解释一下。
test_dlopen.cpp文件中通过dlopen加载test_module.cpp生成的test_module.so。
这里有个要求是test_module.cpp中调用了test_dlopen.cpp中的一个类。
先列出三个文件和g++命令.
1 test_dlopen.h
#ifndef _TEST_DLOPEN_H
#define _TEST_DLOPEN_H
class A
{
public:
A(){}
~A(){}
void hello();
};
#endif
2 test_dlopen.cpp
#include
#include
#include "test_dlopen.h"
typedef void (*FuncType)(A*);
void A::hello()
{
printf("hello,worldn");
}
int main()
{
void* handle = dlopen("./test_module.so", RTLD_NOW);
if (handle == NULL) {
printf("dlopen error error=%sn", dlerror());
return 1;
}
FuncType func = (FuncType)dlsym(handle, "helloWorld");
if (func == NULL)
{
printf("dlsymn");
return 1;
}
A* a = new A;
func(a);
dlclose(handle);
return 0;
}
g++编译命令:g++ -o test_dlopen -ldl test_dlopen.cpp
3 test_module.cpp
#include
#include
#include "test_dlopen.h"
extern "C" void helloWorld(A* a){
a->hello();
}
g++编译命令:g++ -o test_module.so -shared -fPIC test_module.cpp
这两个命令都可以编译链接过去。
但是在运行./test_dlopen的时候出错:dlopen error error=./test_module.so: undefined symbol: _ZN1A5helloEv
后来重新编译生成test_module.so : g++ -o test_module.so -shared -fPIC test_module.cpp test_dlopen.cpp
成功运行。
我不明白这里面的原因,请大家帮忙解释一下。
|
应该是 A::hello放在 test_dlopen.cpp 中没有导出来。
g++ -o test_dlopen -ldl -fPIC test_dlopen.cpp
g++ -o test_module.so -shared -fPIC test_module.cpp
你试试上面这个组合行不行,需要把test_dlopen.cpp里面的也导出来,链接的时候才找的到
不过我看好像别人的例子都是 把void hello(); 纯虚函数,A搞成纯虚类。在里面再 继承实现。 在test_module.cpp还是用的A的指针,这样第一个不使用-fPIC 也没有这样的问题了。
g++ -o test_dlopen -ldl -fPIC test_dlopen.cpp
g++ -o test_module.so -shared -fPIC test_module.cpp
你试试上面这个组合行不行,需要把test_dlopen.cpp里面的也导出来,链接的时候才找的到
不过我看好像别人的例子都是 把void hello(); 纯虚函数,A搞成纯虚类。在里面再 继承实现。 在test_module.cpp还是用的A的指针,这样第一个不使用-fPIC 也没有这样的问题了。
|
你这循环嵌套调用肯定有问题了。
运行提示是找不到a->hello()
运行提示是找不到a->hello()