【问题标题】:Global variable defined with the same name in the so libraryso库中定义的同名全局变量
【发布时间】:2014-11-14 05:13:57
【问题描述】:

我想知道以下场景中的行为:-

//file1.c : Main file of a user-space process,say Process X.
int a; //GLobal variable in file1.c
func(); //Library function

//file2.c :Part of .so used by Process X.
int a;
void func()
{
    a=0;//Access variable a.
}

如果Process X调用库的函数func(),会发生什么?

【问题讨论】:

  • 有趣的问题!也许这个其他问题与类似的东西有关:stackoverflow.com/questions/7201667/…,不过,对于函数。当我阅读一些手册页(ld.so、dlopen)时,似乎变量的处理方式可能不同,但我不是这方面的专家。也在等待一个好的答案!
  • 你理解的问题是对的..:)..我正在寻找与全局变量类似的东西

标签: c linux shared-libraries


【解决方案1】:

file1.c你已经定义了

int a;

告诉编译器为该编译单元中的a 分配内存,所有对a 的引用都将由编译器(并且链接器)。所以file1 看到了自己的a,而file1 看到了自己的a。如果您有,请使用

extern int a;

file1 中,编译器会将这个符号的解析推迟到链接器,然后a 将在file2.c 之外解析。

由于file2 是一个共享对象,if 变量a 应该被其他文件使用,那么file2.so 可能会附带一个file2.h,它具有线

extern int a;

然后这个file2.h 将是#included in file1.c

【讨论】:

  • file2.c 是一个共享对象,动态链接并加载到 Process X。
  • "由于 file2 是一个共享对象,如果变量 a 应该被其他文件使用,那么 file2.so 可能会附带一个 file2.h,它会有一行"不。你'没有明白这一点..另一个文件正在调用访问变量a的函数func()。不需要在头文件中外部变量。头文件将只携带func()的原型。
  • 无需声明extern。因为extern 是默认状态,所以无论是否声明都没有区别。
【解决方案2】:

进行测试。很简单。

file2 中的 a 与 func 链接,因此 file1 中的 a 不会受到影响。它们是不同的两个变量。

【讨论】:

  • 请注意,两者都是“外部全局”变量。file2.c 是共享库
  • @NeelanshMittal 这就是我所说的。在这种情况下,a in file2 不会“动态”链接到 a in file1。
  • File2 是共享对象(动态库)的一部分。它必须动态链接
  • 我错了。干得好。 stackoverflow.com/questions/19373061/… 顺便说一句,C 中的变量默认为外部变量。
  • 来自上面的链接;"同样,ODR 全面适用:外部全局变量将在模块之间共享,这意味着它应该在所有加载的模块中只有一个定义。"。这是我的问题,我在我的场景中打破了这条规则,现在 Wat 会发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-14
相关资源
最近更新 更多