You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:11:06