1

それぞれのファイルを個別にコンパイルしてから、cそれらを1つの実行可能ファイルとしてリンクしようとしています。以下は2つのcファイルです:

file1.c

#include <stdio.h>

void display();
int count;

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

file2.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

ここには2つのオプションがあります。

1)1つのコンパイルユニットで両方のcファイルをコンパイルします。これは、各ファイルがコンパイルされ、すぐにリンクされることを意味します。

gcc file1.c file2.c -o program

この手法の欠点は、いずれかのファイルを変更すると、最初から完全に再コンパイルする必要があることです。大規模なプロジェクトでは、これは時間の無駄になる可能性があります。

2).hファイルを使用して関数を宣言し、この.hファイルを両方の.cファイルにインクルードします。その機能を呼び出すまたは実装する各.cファイルに.hファイルを必ず#includeしてください。

file1.h:

void display();

次に、-cフラグを指定して各.cファイルをコンパイルします。これにより、gccがコードを途中でリンクするのを防ぎます。最後に、コンパイルされた2つのファイルを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 に答える