当前位置:  技术问答>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
#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 也没有这样的问题了。

 

|
你这循环嵌套调用肯定有问题了。
运行提示是找不到a->hello()

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 编动态链接库时,提示 对‘dlopen’未定义的引用.
  • dlopen加载so动态链接库出现段错误的问题
  • Linux下c函数dlopen实现加载动态库so文件代码举例
  • Linux 动态库 dlopen
  • libdl.so这个库有什么用啊?dlopen等只能用于C接口吗?
  • dlopen的超难问题。也是g++和gcc的问题。
  • dlopen的难题
  • 请问在SCO Unix下, dlopen在哪个.a文件中
  • 请教关于dlopen,动态库连接程序的输出函数
  • dlopen出错。
  • 动态库dlopen时候:ELF file OS ABI invalid
  • Linux 动态库 dlopen()失败,errno = 17, File exists
  • c程序调dlopen C++的动态库的问题,急!
  • 求解:Aix5.2系统中dlopen错误,dlerror返回“Bad Address”
  • dlopen 里面异常问题怎么解决?求助大家(RedHat AS 2.1 )
  • dlopen(): ./libhello.so: undefined symbol: _ZN10QTransformC1Ev ,这是什么错误?
  • dlopen函数问题
  • 用dlopen和dlsym得到的函数指针,在dlclose后还能继续使用么?
  • 请教:dlopen总是打不开动态库文件??
  • solaris, dlopen 加载动态库崩溃,请帮助分析谢谢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3