今天发现一个问题,与inline有关,也与编译时候是不是优化有关。

大概问题可以用下面的代码来描述:

先写一个libtest1,代码如下

libtest1.h

#ifndef LIBTEST_H
#define LIBTEST_H class Test{
public:
inline void fun1()const;
void fun2()const;
};
#endif //!LIBTEST_H

libtest1.cpp

#include <stdio.h>
#include "libtest.h" void Test::fun1()const
{
puts("fun1");
} void Test::fun2()const
{
fun1();
puts("fun2 call fun1");
}

编译为动态库,使用命令为:gcc -shared -fpic libtest.cpp -o libtest1.so

然后第二个动态库libtest2,代码如下

#include "libtest.h"

extern "C" void fun3()
{
Test t;
t.fun1();
t.fun2();
}

编译命令为:gcc -shared -fpic libtest2.cpp -o libtest2.so -Wl,-rpath=. -L. -ltest1

然后写测试代码,运行时加载libtest2.so,然后调用fun3函数。代码如下

#include <stdio.h>
#include <dlfcn.h> typedef void (FuncType)(); int main()
{
//void* p = dlopen("./libtest2.so",RTLD_NOW);
void* p = dlopen("./libtest2.so",RTLD_LAZY);
if(p == NULL){
printf("dlopen libtest2.so failed:%s\n",dlerror());
return 0;
}
FuncType* f1 = (FuncType*)dlsym(p,"fun3");
if(f1 == NULL){
printf("dlsym fun3 failed:%s\n",dlerror());
return 0;
}
f1();
dlclose(p);
return 0;
}

编译执行结果如下:

/home/o/sopath [o@o-pc] [13:40]
> gcc test.cpp -o test -ldl /home/o/sopath [o@o-pc] [13:41]
> ./test
fun1
fun1
fun2 call fun1

看起来好像没有问题,但是这里编译的时候都没有进行优化,使用的默认选项,如果我们编译命令修改一下,则就变了

/home/o/sopath [o@o-pc] [13:34]
> gcc -shared -fpic libtest.cpp -o libtest.so -O3
/home/o/sopath [o@o-pc] [13:41]
> ./test
./test: symbol lookup error: ./libtest2.so: undefined symbol: _ZNK4Test4fun1Ev

这时候就找不到fun1这个函数了,使用strings libtest1.so也确实找不到。但是如果把fun1前面的inline去掉,就没有问题了。

最新文章

  1. 一句jQuery代码返回顶部
  2. Odoo Xml Datetime 类型显示为 Date类型
  3. iOS7隐藏状态栏 statusBar
  4. 如何彻底的卸载和删除Windows service
  5. Python 命令详解
  6. Codevs 5126 推销员 2015年NOIP全国联赛普及组
  7. [zz]android的logcat详细用法
  8. WPF MediaElement.Position属性
  9. 【原创】Android 系统稳定性 - ANR(二)
  10. “AIR SDK 0.0: AIR SDK location “...\devsdks\AIRSDK\Win” does not exist.”问题解决~
  11. HDU1312 Red and Black 解读
  12. jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)
  13. jenkins~集群分发功能的具体实现
  14. 《Java并发编程实战》/童云兰译【PDF】下载
  15. PostgresSQL中的限制和级联删除
  16. 分布式监控系统Zabbix-图形集中展示插件Graphtree安装笔记
  17. django在读取数据库时未筛选到符合条件的记录会报错
  18. (转)OpenCV 访问Mat中每个像素的值
  19. 编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
  20. VIN-Fusion config with Realsense D435i

热门文章

  1. 调用write方法打印语句到浏览器
  2. jquery的clone方法应用于textarea和select的bug修复不能copy值,clone id重复的解决
  3. AOJ 2170 Marked Ancestor[并查集][离线]
  4. zjoi 小星星
  5. Linux与Windows中的UTC时间
  6. python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)
  7. 微信小程序开发--第一个项目
  8. curl 文件上传
  9. nc高级应用
  10. P1279 字串距离