【问题标题】:Linker doesn't show any error, weird链接器没有显示任何错误,很奇怪
【发布时间】:2014-06-28 22:45:16
【问题描述】:

假设我有2个C src文件,A1.C,A2.C,这些是内容:

A1.C

int x;
int main(){
     void f(void);

     x = 5; 
     f();
     printf("%d", x);

     return 0;
}

A2.C

int x;
void f() {  x = 4; }

尽管缺少“extern”安全字,链接器并没有给我任何错误。我有 2 个相同的符号。有人能解释一下为什么吗?

【问题讨论】:

  • 您是否尝试添加一些警告选项,例如-W(用于 GCC)等等...?
  • 我相信如果你没有 extern,编译器会删除其中一个冗余变量
  • @apache 这不太可能。如果它像你说的那样发生,那么extern 密钥将毫无用处。但也许,编译器将这两个变量视为static。更容易知道问题是否包含此类代码产生的输出。
  • @Unda:它们被声明为具有外部链接。不给出存储类说明符表示“外部链接”,extern 表示“已经给出的链接,如果没有给出,则为外部的”。

标签: c linker static-linking extern linkage


【解决方案1】:

对于 gcc,您可以使用 -fno-common 标志将其变为错误。

gcc 文档解释了发生了什么

-fno-common

在 C 代码中,控制未初始化的全局变量的位置。 Unix C 编译器传统上允许多个 这些变量在不同编译单元中的定义 将变量放在一个公共块中。这是行为 由 -fcommon 指定,并且是大多数目标上 GCC 的默认值。

开启 另一方面,ISO C 并不要求这种行为,并且在某些情况下 目标可能会对变量引用带来速度或代码大小的损失。

-fno-common 选项指定编译器应该放置 目标文件的数据部分中未初始化的全局变量, 而不是将它们作为公共块生成。这样做的效果是 如果在两个不同的地方声明了相同的变量(没有外部) 编译时,链接它们时会出现多定义错误。

另见Tentative definitions in C99 and linking

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多