linux编译符号那些事儿

其实符号这个概念,有点底层功底的程序员都应该晓得。其实就是标志的意思。比如说,标志属性(变量),一个行为(函数)或者其他。

在linux下编译,时间长了,一定会遇到使用【nm】【ldd】【readelf】的时候。微笑

不扯淡了,直接进入到今天的正题。你跟着这边文章看下来,你应该可以学会下面几点:

1,dlopen可能比-llibrary的编译更靠谱。(我也不知道为什么)

2,dlopen不能打开【还存在未定义符号】的动态库

3,类什么时候会报未定义


好了,我们直接切入主题:

工程介绍

1,1.h 1.cpp ==> 1.so

2,main.cpp ===> main(采用动态加载动态库的技术)

代码

1.h

class A
{
public:
     A();
     ~A();
}
extern "C"
{
     A* GetAddr()
     {
          return new A();
     }
};


1.cpp

A::A()
{

}

注意:我没有实现析构函数。


你可以编译成1.so


main.cpp

#include <dlfcn.h>

#include "1.h"

int main()
{
	void* module = dlopen("./lib1.so", RTLD_LAZY);
	if (module == NULL)
	{
		cout << dlerror() << endl;
	}
	return 0;
}

编译的时候指定-rdynamic -ldl -fPIC


好啦~


你应该在运行的时候报A这个类符号未定义。



使用nm看看lib1.so吧,发现果然A这个符号是U型的

到此为止,你应该明白了

2,dlopen不能打开【还存在未定义符号】的动态库

3,类什么时候会报未定义


至于第一点,我弄清楚了再说。




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值