C++中动态库中全局变量

发布时间 2023-12-27 21:05:23作者: Hello-World3

一、疑问

1. C++程序中可以使用动态库中的全局变量吗?如果可以两个进程同时链接使用,全局变量的值会相互干扰吗(是否有2份)?


二、实验

1. 实验源文件

lib_file.cpp

int g_lib_val = 10;

int lib_add(int a, int b) {
    return a+b;
}

sharelib_tets.cpp

#include <stdio.h>
#include <unistd.h>

extern int g_lib_val;

int main(int argc, char **argv)
{
    while(1) {
        if (argc > 1) {
            g_lib_val--;
        } else {
            g_lib_val++;
        }
        printf("g_lib_val=%d\n", g_lib_val);
        sleep(1);
    }
    return 0;
}


2. 编译指令

g++ -shared -o liblib_file.so lib_file.cpp //编译生成成动态库liblib_file.so
g++ sharelib_tets.cpp -L . -llib_file -o pp //使用动态库编译可执行文件pp
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. //导出环境变量,否则执行./pp时报找不到库


3. 执行测试

shareLib$ ./pp
g_lib_val=11
g_lib_val=12
g_lib_val=13
...

shareLib$ ./pp 1
g_lib_val=9
g_lib_val=8
g_lib_val=7
...

可以看到互不干扰,也就是说不但可以使用动态库中的全局变量,而且全局变量在每个进程里面都有一份拷贝。

注:但是Android上实测,Servicemanager无法通过这种方法访问 libbinder 中的全局变量。


三、补充

1. 静态库(.a、.lib),动态库(.so、.dll)

2. 动态链接(Dynamic Linking)把链接过程推迟到运行时再进行。

3. 静态库包含在可执行文件中,而动态库只在程序中创建一个符号表(库代码中引用的函数、变量)。

 


参考:
C++中编译静态库与动态库:https://blog.csdn.net/scott198510/article/details/128972324
【c++】——动态库中全局变量:https://blog.csdn.net/u011622208/article/details/108973665