到目前为止,我假设 C 中具有静态链接的对象(即静态函数和静态变量)不会与其他编译单元(即.c文件)中的其他对象(静态或外部链接)发生冲突,因此我使用了“short”内部辅助函数的名称,而不是用库名称作为所有内容的前缀。最近,我的库的一个用户由于与另一个共享库的导出函数发生名称冲突而发生崩溃。经过调查发现,我的几个静态函数是共享库符号表的一部分。由于它发生在几个 GCC 主要版本中,我认为我遗漏了一些东西(这样的主要错误会被注意到并修复)。
我设法将其简化为以下最小示例:
#include <stdbool.h>
#include <stdlib.h>
bool ext_func_a(void *param_a, char const *param_b, void *param_c);
bool ext_func_b(void *param_a);
static bool bool_a, bool_b;
static void parse_bool_var(char *doc, char const *var_name, bool *var)
{
char *var_obj = NULL;
if (!ext_func_a(doc, var_name, &var_obj)) {
return;
}
*var = ext_func_b(var_obj);
}
static void parse_config(void)
{
char *root_obj = getenv("FOO");
parse_bool_var(root_obj, "bool_a", &bool_a);
parse_bool_var(root_obj, "bool_b", &bool_b);
}
void libexample_init(void)
{
parse_config();
}
Run Code Online (Sandbox Code Playgroud)
静态变量bool_a和静态函数parse_bool_var在目标文件和共享库的符号表中都是可见的:
$ gcc -Wall …Run Code Online (Sandbox Code Playgroud)