今天发现一个问题,与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去掉,就没有问题了。

gcc下inline的一个问题的更多相关文章

  1. Ubuntu系统下的第一个console程序

    进入自己喜欢的目录,前面步骤和windows基本一致,只简单描述下 执行 dotnet new 然后执行 dotnet restore 然后执行 dotnet run 第一次未编译,会自动编译,然后可 ...

  2. time模块目录下自己建立一个名为log的文件夹

    使用python调用ping命令,然后在日志中记录ping的结果,用来监测网络连通情况. 代码: [python]from time import *from subprocess import *w ...

  3. MinGW GCC下sleep()函数问题

    在MinGW GCC下编译带sleep()函数的测试程序,不管是包含了unistd.h头文件,还是stdio.h.stdlib.h头文件,就是找不到该函数的定义!在linux下,sleep()函数的头 ...

  4. 在linux下,查看一个运行中的程序, 占用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...

  5. GCC下32位与64位机器类型变量所占字节数

    GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...

  6. python3 selenium 随机选择同一类型下的某一个元素

    使用场景: 如上图所示,有时候,我们测试的时候,不会每个方向都选择一遍,也不能每次都选择一个方向,这个时候就需要每次运行用例的时候,随机选择一个方向来测试 使用方法: random.randint() ...

  7. npm 是node.js下带的一个包管理工具

    npm 是node.js下带的一个包管理工具          npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...

  8. 找到div下的第一个ul

    $("div#div的id ul li a")//选择的是div下 ul下所有li下的所有a标签 $("div#div的id").children(" ...

  9. 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7514559 在Android系统中修改android.mk使其同时编译rgb2565和rgb ...

随机推荐

  1. yum 命令下载安装Openjdk

    https://blog.csdn.net/bobo0915/article/details/80707184

  2. Codeforces Round #319 (Div. 2) D - Invariance of Tree

    Invariance of Tree 题目大意:给你一个有1-n组成的序列p,让你构造一棵树,如果节点a和b之间有一条边,则p[a]和p[b]之间也有一条边. 思路:没啥思路,看了题解菜爆. 我们可以 ...

  3. Codeforces Round #144 (Div. 2) D table

    CodeForces - 233D 题目大意给你一个n*m 的矩阵,要求你进行涂色,保证每个n*n的矩阵内都有k个点被涂色. 问你一共有多少种涂色方案. n<=100 && m& ...

  4. BZOJ1201 [HNOI2005]数三角形 大力出奇迹

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1201 题意概括 题解 n3跑过去了,大力出奇迹!简单的,不多说了. 代码 #include < ...

  5. 【Java】 剑指offer(5) 从尾到头打印链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个链表的头结点,从尾到头反过来打印出每个结点的值.结点定义如下: ...

  6. KAFKA的安装使用

    一:介绍 1.官网 kafka.apache.org 2.产生 Kafka由 linked-in 开源  kafka-即是解决上述这类问题的一个框架,它实现了生产者和消费者之间的无缝连接.  kafk ...

  7. python tkinter-按钮.标签.文本框、输入框

    按钮 无功能按钮 Button的text属性显示按钮上的文本 tkinter.Button(form, text='hello button').pack() 无论怎么变幻窗体大小,永远都在窗体的最上 ...

  8. Python常用模块--string

    该模块提供3个常用的功能: * 提供常用的字符串常量(感觉用途不大) * 提供字符串替换功能,主要用途是上下文的国际化(通过str可以实现,不介绍,感兴趣的自己看官网) * 提供字符串的格式化功能(感 ...

  9. Object类浅析

    Object类的方法有: hashCode(): 返回该对象的哈希码值 hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回 ...

  10. SQL 查询存储过程

    select distinct name from syscomments a,sysobjects b where a.id=b.id and b.xtype='p' --and text like ...