C语言多源文件链接错误排查:我的代码问题出在哪?
问题分析与修复方案
你的代码存在三个核心问题,导致编译链接错误:
1. 全局变量仅声明未定义
头文件prog.h中用extern声明了name和age,但extern只是告诉编译器"这个变量在别处定义",并没有实际分配内存。链接器找不到这两个变量的实际定义,因此抛出undefined reference错误。
修复:在prog.c开头添加全局变量的定义(去掉extern):
#include "prog.h" // 实际定义全局变量,分配内存 char* name; int age; void set_data(char* a_name, int a_age) { name = a_name; age = a_age; } void print_data(char *name, int age) { printf("Name: %s\nAge: %d\n", name, age); }
2. set_data函数缺少声明
prog.h中只声明了print_data,没有声明set_data函数。main.c调用set_data时会触发隐式声明警告,且C99及以后标准不允许隐式函数声明。
修复:在prog.h中添加set_data的函数声明:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <error.h> #define ERROR(s) perror(s) #define BUFF 1024 extern char* name; extern int age; void set_data(char* a_name, int a_age); // 添加函数声明 void print_data(char* name, int age);
3. 参数类型不匹配
main.c中直接传递argv[2]给set_data的int参数,argv[2]是字符串类型(char*),直接传递会把指针地址当作整数赋值,逻辑完全错误。同时缺少参数数量检查,容易触发数组越界。
修复:用atoi()将字符串转换为整数,同时添加参数合法性检查:
#include "prog.h" #include <stdlib.h> int main(int argc, char **argv) { if (argc < 3) { fprintf(stderr, "用法: %s <姓名> <年龄>\n", argv[0]); return EXIT_FAILURE; } set_data(argv[1], atoi(argv[2])); print_data(name, age); return EXIT_SUCCESS; }
修复后编译验证
重新执行编译命令:
gcc -o main main.c prog.c
运行程序时传入两个参数即可正常工作:
./main "张三" 25
内容的提问来源于stack exchange,提问作者Rams
相关产品推荐
相关产品推荐

