gcc下inline的一个问题
2024-08-22 04:47:51
今天发现一个问题,与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
去掉,就没有问题了。
最新文章
- 一句jQuery代码返回顶部
- Odoo Xml Datetime 类型显示为 Date类型
- iOS7隐藏状态栏 statusBar
- 如何彻底的卸载和删除Windows service
- Python 命令详解
- Codevs 5126 推销员 2015年NOIP全国联赛普及组
- [zz]android的logcat详细用法
- WPF MediaElement.Position属性
- 【原创】Android 系统稳定性 - ANR(二)
- “AIR SDK 0.0: AIR SDK location “...\devsdks\AIRSDK\Win” does not exist.”问题解决~
- HDU1312 Red and Black 解读
- jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)
- jenkins~集群分发功能的具体实现
- 《Java并发编程实战》/童云兰译【PDF】下载
- PostgresSQL中的限制和级联删除
- 分布式监控系统Zabbix-图形集中展示插件Graphtree安装笔记
- django在读取数据库时未筛选到符合条件的记录会报错
- (转)OpenCV 访问Mat中每个像素的值
- 编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
- VIN-Fusion config with Realsense D435i
热门文章
- 调用write方法打印语句到浏览器
- jquery的clone方法应用于textarea和select的bug修复不能copy值,clone id重复的解决
- AOJ 2170 Marked Ancestor[并查集][离线]
- zjoi 小星星
- Linux与Windows中的UTC时间
- python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)
- 微信小程序开发--第一个项目
- curl 文件上传
- nc高级应用
- P1279 字串距离