C 如何在多个模块中处理静态全局变量?

C 如何在多个模块中处理静态全局变量?,c,plugins,static,global,C,Plugins,Static,Global,在C语言中,在全局级别(在任何函数之外)声明变量static,表示该变量仅对链接器对象可见(通常是.C文件) 如果同一个.C文件是多个不同库的一部分,这些库在一个可执行文件中链接在一起,是否会发生冲突 例如: MyFile.c 如果我有: 插件\u Alpha.so:由MyFile.C+AlphaSource.C组成 Plugin_Beta.so:由MyFile.C+BetaSource.C组成 MainProgram.exe:由MainCode.C(加载两个插件)组成 Plugin_Alpha

在C语言中,在全局级别(在任何函数之外)声明变量
static
,表示该变量仅对链接器对象可见(通常是.C文件)

如果同一个.C文件是多个不同库的一部分,这些库在一个可执行文件中链接在一起,是否会发生冲突

例如:

MyFile.c 如果我有:

插件\u Alpha.so:由MyFile.C+AlphaSource.C组成
Plugin_Beta.so:由MyFile.C+BetaSource.C组成
MainProgram.exe:由MainCode.C(加载两个插件)组成

Plugin_Alpha和Plugin_Beta是否会有单独的、独立的
globalData副本?

或者他们最终会引用相同的结构?

好吧,这里有一种方法可以找到:

文件
liba.c

static int globalData;

int *GetGlobalData() { return &globalData; }
编译成两个单独的共享库:

$ gcc liba.c -o liba.so -fPIC -shared
$ gcc liba.c -o libb.so -fPIC -shared
主程序:

#include <dlfcn.h>
#include <stdio.h>

int main(void)
{
  // Error checking omitted for expository purposes

  void *liba = dlopen("liba.so", RTLD_LAZY);
  void *libb = dlopen("libb.so", RTLD_LAZY);

  typedef int* (*FuncV_IP)(void);
  FuncV_IP funca = (FuncV_IP)dlsym(liba, "GetGlobalData");
  FuncV_IP funcb = (FuncV_IP)dlsym(libb, "GetGlobalData");

  printf("Module A: GetGlobalData() ==> %p\n", funca());
  printf("Module B: GetGlobalData() ==> %p\n", funcb());

  dlclose(liba);
  dlclose(libb);

  return 0;
}
输出:

Module A: GetGlobalData() ==> 0x7fa97536d020
Module B: GetGlobalData() ==> 0x7fa97516b020

因此,每个共享库都有自己的全局变量副本。

好吧,这里有一种方法可以找到:

文件
liba.c

static int globalData;

int *GetGlobalData() { return &globalData; }
编译成两个单独的共享库:

$ gcc liba.c -o liba.so -fPIC -shared
$ gcc liba.c -o libb.so -fPIC -shared
主程序:

#include <dlfcn.h>
#include <stdio.h>

int main(void)
{
  // Error checking omitted for expository purposes

  void *liba = dlopen("liba.so", RTLD_LAZY);
  void *libb = dlopen("libb.so", RTLD_LAZY);

  typedef int* (*FuncV_IP)(void);
  FuncV_IP funca = (FuncV_IP)dlsym(liba, "GetGlobalData");
  FuncV_IP funcb = (FuncV_IP)dlsym(libb, "GetGlobalData");

  printf("Module A: GetGlobalData() ==> %p\n", funca());
  printf("Module B: GetGlobalData() ==> %p\n", funcb());

  dlclose(liba);
  dlclose(libb);

  return 0;
}
输出:

Module A: GetGlobalData() ==> 0x7fa97536d020
Module B: GetGlobalData() ==> 0x7fa97516b020
因此,每个共享库都有自己的全局变量副本