【发布时间】:2014-12-04 15:33:03
【问题描述】:
您好 StackOverflow 向导:
我有以下三个简单的 C 文件:
// File 1
#include "mainPgm.h"
void file1() {
printf("N1 is now %d.\n", n1);
}
// File 2
#include "mainPgm.h"
void file2() {
printf("N2 is now %d.\n", n2);
}
// File 3
#include "mainPgm.h"
void file3() {
printf("N3 is now %d.\n", n3);
}
当然还有一个主程序:
#include <stdio.h>
#include <stdlib.h>
#include "mainPgm.h"
int main() {
int n1 = 65536,
n2 = 256,
n3 = 16;
file1();
file2();
file3();
}
最后是一个头文件:
#include<stdio.h>
void file1(), file2(), file3();
extern int n1, n2, n3;
所有这些都是用一个简单的 gcc 命令编译的:
gcc -std=gnu99 -O2 -o jj -Wunused file1.c file2.c file3.c mainPgm.c
这会导致以下错误:
mainPgm.c: In function ‘main’:
mainPgm.c:8:7: warning: unused variable ‘n3’ [-Wunused-variable]
mainPgm.c:7:7: warning: unused variable ‘n2’ [-Wunused-variable]
mainPgm.c:6:7: warning: unused variable ‘n1’ [-Wunused-variable]
/tmp/ccVQjFHY.o: In function `file1':
file1.c:(.text+0x2): undefined reference to `n1'
/tmp/ccZqyI0n.o: In function `file2':
file2.c:(.text+0x2): undefined reference to `n2'
/tmp/ccbpJOpN.o: In function `file3':
file3.c:(.text+0x2): undefined reference to `n3'
collect2: error: ld returned 1 exit status
我认为在 mainPgm.h 中定义 n1、n2 和 n3 将用于声明变量,而它们在 mainPgm.c 中的定义将定义它们。不这样!我哪里做错了?
TIA!
【问题讨论】:
-
您可能(或可能不)注意:(1)您的主程序不使用来自
<stdlib.h>或<stdio.h>的任何代码(因此这些包含是不必要的); (2) 标头"mainPgm.h"不需要包含<stdio.h>,因为其中的任何声明都不依赖于来自<stdio.h>的任何声明——但如果您从"mainPgm.h"中删除了<stdio.h>,则需要在每个fileN.c文件中明确包含<stdio.h>。在mainPgm.c文件中,您实际上包含了两次<stdio.h>。这是无害的;标准 C 标头是自包含且幂等的。你的标题也应该是。 -
我从 mainPgm.c 中删除了 stdio 和 stdlib 声明,并且没有编译问题。