gpt4 book ai didi

gcc - 让 GCC 链接器警告多个函数定义

转载 作者:行者123 更新时间:2023-12-04 19:36:23 26 4
gpt4 key购买 nike

考虑我的小示例 C 库:

#include <external_library.h>

void some_function(void)
{
external_library_call();
// Do other stuff...
}

它计划让 some_function() 可以公开调用。但是,该库不起作用,因为它所需的外部库也恰好使用了一个名为 some_function() 的函数,该函数恰好具有相同的原型(prototype)。不过,GCC 的链接器并不关心 some_function 符号的来源有多少。它看似随机选择一个,外部库可能会也可能不会使用我的 some_function() 而不是它自己的。疯了吧。不是图书馆不工作的事实。这个库绝对不应该工作。更重要的是符号“some_function”有两个来源,但链接器对此没有做任何事情。而且你知道,这并没有让我太困扰,因为我习惯了 GCC 和 C 通常默认情况下是病态的鲁莽。但是,必须有一种方法可以让链接器在同一符号有两个来源时警告我。我已经尝试过 -Wall -Wextra -Wshadow,但这不会产生任何警告。

请注意,-fvisibility=hidden 在这里没有帮助,因为两个库都想导出 some_function()。我知道您可以对我在没有唯一前缀的情况下进行函数调用感到羞耻。你是对的。这是一个错误。我不在乎。这个错误可以被链接器捕获,因此应该被捕获。链接器没有理由不捕捉这个错误。此外,您使用的库可能会导出一些奇怪的意外符号,并且您不一定可以控制其他人的库导出的内容。只有在程序员停下来并着火之前,那个和前缀才能变得如此独特。

最佳答案

添加:

-fvisibility=hidden

To your build flags. Note some caveats, however; some headers might not be expecting this. In those cases, you need to use a pragma before including them:

#pragma GCC visibility push(hidden)
#include <problematic_header>
#pragma GCC visibility pop

除了避免符号冲突之外,还有其他一些好处。看:

http://gcc.gnu.org/wiki/Visibility

如果你有兴趣。

关于gcc - 让 GCC 链接器警告多个函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com