首页 新闻 会员 周边

c 中使用 extern 引入的变量报错: collect2.exe: error: ld returned 1 exit status

0
悬赏园豆:10 [待解决问题]

main 文件中 使用 extern 引入 outer 文件中的 age,运行时报错, 目录结构和报错如下

继君的主页 继君 | 菜鸟二级 | 园豆:202
提问于:2024-06-08 20:11
< >
分享
所有回答(2)
0

outer.c没有参与编译,编译命令改下
gcc main.c outer.c -o main

www378660084 | 园豆:337 (菜鸟二级) | 2024-06-11 11:12
0

在C语言中,使用extern关键字声明外部变量时,如果报错 collect2.exe: error: ld returned 1 exit status,通常是因为链接器找不到变量的定义。这里是如何解决这个问题的步骤。

目录结构
假设你的目录结构如下:

css
Copy code
project/

├── main.c
├── outer.c
└── outer.h
代码示例
outer.h
c
Copy code
// outer.h

ifndef OUTER_H

define OUTER_H

extern int age;

endif // OUTER_H

outer.c
c
Copy code
// outer.c

include "outer.h"

int age = 25;
main.c
c
Copy code
// main.c

include <stdio.h>

include "outer.h"

int main() {
printf("Age is %d\n", age);
return 0;
}
编译步骤
确保你在编译时包含所有相关的C文件。使用gcc编译时,可以像这样:

sh
Copy code
gcc main.c outer.c -o main
详细步骤
声明和定义变量:

在outer.h中声明外部变量age。
在outer.c中定义变量age。
引用外部变量:

在main.c中引用outer.h并使用变量age。
编译链接:

编译时要确保所有源文件都包含在编译命令中。
错误分析
collect2.exe: error: ld returned 1 exit status 是链接错误,通常是因为:

变量age没有被定义。
链接器找不到定义变量的目标文件。
检查点
检查头文件的防止重复定义:
确保outer.h中使用了头文件保护:

c
Copy code

ifndef OUTER_H

define OUTER_H

// declarations

endif

确保定义文件被编译:
确保定义了变量的C文件(如outer.c)包含在编译命令中。

额外提示
如果仍然报错:
确认你的编译环境正确配置,可以单独编译每个文件检查是否有其他语法错误。
使用更详细的编译选项来诊断错误,例如 gcc -Wall -Wextra main.c outer.c -o main。
完整编译示例
以下是一个完整的编译示例:

sh
Copy code
gcc main.c outer.c -o main -Wall -Wextra
这将确保所有相关文件都编译并链接在一起,并显示所有警告和额外信息,帮助诊断潜在的问题。

Technologyforgood | 园豆:6468 (大侠五级) | 2024-06-13 16:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册