【发布时间】:2012-12-09 06:13:54
【问题描述】:
考虑一下我的小示例 C 库:
#include <external_library.h>
void some_function(void)
{
external_library_call();
// Do other stuff...
}
它计划让 some_function() 可以公开调用。但是,该库不起作用,因为它所需的外部库也恰好使用了一个名为 some_function() 的函数,该函数恰好具有相同的原型。不过,GCC 的链接器并不关心 some_function 符号的来源有多少。它看似随机选择一个,外部库可能会也可能不会使用我的 some_function() 而不是它自己的。疯了吧。不是图书馆不工作的事实。这个库绝对不应该工作。更重要的是符号“some_function”有两个来源,但链接器对此没有做任何事情。而且你知道,这并没有让我太困扰,因为我习惯了 GCC 和 C 通常默认情况下是病态的鲁莽。但是,必须有一种方法可以让链接器在同一符号有两个来源时警告我。我已经尝试过 -Wall -Wextra -Wshadow,但这不会产生任何警告。
请注意,-fvisibility=hidden 在这里没有帮助,因为两个库都想导出 some_function()。我知道您可以对我在没有唯一前缀的情况下进行函数调用感到羞耻。你说得对。这是一个错误。我不在乎。这个错误可以被链接器捕获,因此应该被捕获。链接器没有理由不捕捉这个错误。此外,您使用的库可能会导出一些奇怪的意外符号,并且您不一定可以控制其他人的库导出的内容。只有在程序员停下来并着火之前,才能使前缀和前缀变得如此独特。
【问题讨论】:
标签: gcc warnings symbols one-definition-rule