博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gcc下inline的一个问题
阅读量:6326 次
发布时间:2019-06-22

本文共 1611 字,大约阅读时间需要 5 分钟。

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

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

先写一个libtest1,代码如下

libtest1.h

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

libtest1.cpp

#include 
#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 
#include
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 fun1fun1fun2 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去掉,就没有问题了。

转载地址:http://selaa.baihongyu.com/

你可能感兴趣的文章
从头开始学习Vuex
查看>>
阿里云文件存储的高性能架构演进之路
查看>>
js正则表达式学习笔记
查看>>
G2 定制仪表盘实践
查看>>
轻量级 memcached缓存代理 twemproxy实践
查看>>
vue-cli3 搭建的前端项目基础模板
查看>>
LeetCode 700——二叉搜索树中的搜索
查看>>
诗和远方 旅行小账本云开发实战
查看>>
MySQL SQL模式特点汇总
查看>>
anu小程序快速入门
查看>>
【跃迁之路】【570天】程序员高效学习方法论探索系列(实验阶段327-2018.08.29)...
查看>>
Slog67_后端框架Skynet之Makefile解读
查看>>
QuickBI助你成为分析师——计算字段功能
查看>>
弹性盒布局
查看>>
ES6 系列之模拟实现一个 Set 数据结构
查看>>
ubuntu16.04下hyperledger-fabric的环境搭建
查看>>
JavaScript-函数,作用域
查看>>
我为什么不要30岁以上的程序员?
查看>>
[case24]springboot2输出metrics到influxdb
查看>>
前端技术周刊 2018-07-08:AR 与人脸识别
查看>>