1

我正在尝试分别编译每个c文件,然后将它们链接在一起作为单个可执行文件。以下是2个c文件:

文件1.c

#include <stdio.h>

void display();
int count;

int main() {
 printf("Inside the function main\n");
 count = 10;
 display();
}

文件2.c

#include <stdio.h>

extern int count;
void display() {
  printf("Sunday mornings are beautiful !\n");
  printf("%d\n",count);
}

但是当我尝试编译它们时,我得到了一些错误:

当我编译 file1.c

gcc file1.c -o file1
/tmp/ccV5kaGA.o: In function `main':
file1.c:(.text+0x20): undefined reference to `display'
collect2: ld returned 1 exit status

当我编译 file2.c

gcc file2.c -o file2
/usr/lib/gcc/i686-redhat-linux/4.6.3/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
/tmp/cczHziYd.o: In function `display':
file2.c:(.text+0x14): undefined reference to `count'
collect2: ld returned 1 exit status

我犯了什么错误?

4

3 回答 3

4

您正在分别编译每个,但问题是您还试图分别链接它们。

gcc file1.c file2.c  -o theprogram   # compile and link both files

或者:

gcc -c file1.c        # only compiles to file1.o
gcc -c file2.c        # only compiles to file2.o

gcc file1.o file2.o -o the program   # links them together
于 2012-10-28T03:55:40.663 回答
2

您必须将它们链接到单个可执行文件中。

gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
gcc file1.o file2.o -o theprogram
于 2012-10-28T03:57:19.603 回答
2

您在这里有两个选择:

1) 在一个编译单元中编译两个 c 文件。这意味着每个文件都被编译,然后它们被立即链接。

gcc file1.c file2.c -o program

这种技术的缺点是对任一文件的更改都需要从头开始完全重新编译。在一个更大的项目中,这可能是浪费时间。

2) 使用 .h 文件声明函数并将此 .h 文件包含在两个 .c 文件中。确保在调用或实现其功能的每个 .c 文件中#include .h 文件。

文件1.h:

void display();

然后,使用 -c 标志编译每个 .c 文件。这可以防止 gcc 过早地链接代码。最后,用 gcc 链接这两个编译好的文件。

总之:

gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
gcc file1.o file2.o -o myprogram

我建议您查看 Makefiles,它可以帮助您自动化此过程。

于 2012-10-28T04:02:45.187 回答