在C中,在全局级别(在任何函数之外)声明变量static
表示它仅对该链接器对象(通常是.C文件)可见。
如果同一个.C文件是多个不同库的一部分,然后在一个可执行文件中链接在一起,会出现冲突吗?
例如:
typedef struct {
[my important data];
} MyGlobalType;
static MyGlobalType globalData = { [...data...] };
然后,如果我有:
Plugin_Alpha.so :由MyFile.C + AlphaSource.C 组成 Plugin_Beta.so :由MyFile.C + BetaSource.C 组成 MainProgram.exe :由MainCode.C(加载两个插件)组成
Plugin_Alpha和Plugin_Beta会有globalData
的独立副本吗?
或者他们最终会引用相同的结构吗?
答案 0 :(得分:3)
嗯,这是找到答案的一种方法:
档案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;
}
编译并运行它:
$ gcc main.c -ldl
$ LD_LIBRARY_PATH=. ./a.out
输出:
Module A: GetGlobalData() ==> 0x7fa97536d020
Module B: GetGlobalData() ==> 0x7fa97516b020
因此,每个共享库都有自己的全局变量副本。