动态库中的变量

    博客分类: 知识归纳 阅读次数:

动态库中的变量

最近新引擎在安卓平台遇到了问题:在armlinux下编译和运行都没问题,但是在安卓上运行会崩溃。

这个问题不是我排查的,不过崩溃的原因值得记录。是因为在动态库接口里使用了stl变量。导致问题的原因有两点:

  1. stl变量大多会直接或者间接地使用静态变量,而静态变量并不是全局唯一的——只是编译单元内唯一。因此,静态变量在主程序和动态库中都会有一个副本。​在主程序和动态库中会访问到不同的副本。

  2. 主程序和动态库使用的编译器可能不一样,不同的编译器编译出来的变量内存布局可能不同。因此在主程序和动态库之间传递stl变量,可能导致访问出错。

总之,库的接口尽量不要使用stl变量。

由这个问题又想到了另一个问题:如果一个动态库同时被多个进程使用,那么其中的静态变量以及全局变量是共用的吗?答案是否定的。动态库运行时,代码段被使用的各进程共享(也就是说物理内存中只有一份),数据段是是私有的,每个进程都有自己的数据副本。

假设现在有两个进程都使用了一个动态库,库接口中使用了stl变量,该stl变量使用了静态变量a,那么实际上会有四个a:每个进程都有一份动态库的数据副本,共有有两个;两个进程的主程序又各自有一份,加起来就是4份。

参考资料

  1. DLL中传递STL参数,vector对象作为dll参数传递等问题
  2. 动态库被多个程度调用时是怎么运行的
  3. Linux C中动态链接库的全局变量问题