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

一、疑问

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

 

posted on   Hello-World3  阅读(799)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示