在动态库中设置共享变量

时间:2014-05-13 13:25:12

标签: c global-variables extern

我创建了一个日志库liblog.so。我想分享一个名为File *rt_file的变量,它在lib_rt.h中定义,此标头也由log_rt.c,log_linux.c ==> liblog.sologd.c ==> logdlog_rt_client.c ==> log_rt_client继承。在这里,我创建了一个守护程序logd,它放置(实际应该)file pointer rt_file

这就是我想要做的。 这里liblog.so是一个动态库,logd在启动时启动,它应该将文件指针设置为rt_file,而log_rt_client应该获取文件指针并打印一些日志。

问题来分享公共变量rt_file。 我尝试了

中提出的其他建议

stackoverflow [1]:第一个解决方案是使用extern并完成任务。对于我的情况,我虽然[2]这个。而不是创建一个全局变量将变量放入作用域文件,并使用getset函数来访问值。

但这两个选项对我没有用,让我解释一下。

  1. 我(必须)分别汇编所有文件liblog.so logdlog_rt_client,因此,当log_rt_client宣布rt_file时,它显示错误但是未定义,因为它在logd中定义。这不是(不能)用log_rt_client编译的。虽然所有文件都链接到liblog.so
  2. 当我尝试第二个选项时,结果出乎意料,logd调用liblog.so设置并获取文件指针,但当我运行时log_rt_client rt_file没有预期指针(文件指针)。两者的rt_file均值分配是不同的。
  3. 任何人都可以建议我一个解决方案。希望这能解释一切。

1 个答案:

答案 0 :(得分:0)

您必须使用共享内存

动态库被映射到进程地址空间,因此每个进程都会看到它们的副本 rt_file映射到他们的数据段(我的意思是任何全局变量。在你的情况下,它是rt_file)。