多个.so,相同函数,相同变全局量

tmpacc 2011-10-18 10:46:44
现遇问题如下:
====================================

a.c
#include "xxx"
static int g_var = 0;
int foox(int x)
{
bar(x);
}
static int bar(int x)
{
if (!g_var)
{
g_var++;
do_sth(x);
}
}


b.c
#include "xxx"
static int g_var = 0;

int fooy(x)
{
bar(x);
}

static int bar(x)
{
if(!g_var)
{
g_var++;
do_sth(x);
}
}

main.c

int main()
{
foox(123);
fooy(456);
}



a.c编译成a.so
b.c编译成b.so
main.c 编成可主程序并链接a.so,b.so

问:
1. a.so与b.so中static int g_var全局量是否冲突。
2. a.so与b.so中static bar()是否冲突。

...全文
353 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tmpacc 的回复:]

gdb跟踪fooy→bar时发现,一进入函数,g_var的值已经是1。不知为何?
[/Quote]

楼主可以把单文件的.so理解为一个.o。

可以把多文件.o链接的.so理解为一个exe。

static还是做自己该做的,留在自己的作用域里,你要做的就是包含头文件,链接.so,编译器会自动去你的.so某个.o里的找到定义的,使用的也是.o里的static变量。
lida2003 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 keiy 的回复:]

有static 不会冲突
[/Quote]

正解,变量作用范围这一章讲的很明白。
tmpacc 2011-10-18
  • 打赏
  • 举报
回复
gdb跟踪fooy→bar时发现,一进入函数,g_var的值已经是1。不知为何?
luciferisnotsatan 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 keiy 的回复:]

有static 不会冲突
[/Quote]
++
static这里的用途是说明,该文件内全局可见。
柯本 2011-10-18
  • 打赏
  • 举报
回复
有static 不会冲突
tmpacc 2011-10-18
  • 打赏
  • 举报
回复
现在还有一个问题,如果多个把so中的static函数指针给传出去,外部模块能否调用这个函数?有空试验一下。
tmpacc 2011-10-18
  • 打赏
  • 举报
回复
找到原因了,同名函数bar()前static关键字丢了
初步分析,估计是bar函数就产生了冲突,导致无论是foox还是fooy调用的都是同一个.so中的bar(),而这个bar()总是访问同一个so中的全局变量。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧