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 2023-12-27 20:59 Hello-World3 阅读(686) 评论(0) 编辑 收藏 举报