web-dev-qa-db-ja.com

Cヘッダーの問題:#includeおよび「undefined reference」

申し分なく、私はこれを長い間使ってみましたが、それを正しく動作させることができないようです。 3つのファイル、main.chello_world.c、およびhello_world.h。何らかの理由で、それらはうまくコンパイルされていないようで、私は本当に理由を理解できません...

ここに私のソースファイルがあります。最初のhello_world.c:

#include <stdio.h>
#include "hello_world.h"

int hello_world(void) {
  printf("Hello, Stack Overflow!\n");
  return 0;
}

次に、hello_world.h、シンプル:

int hello_world(void);

そして最後にmain.c:

#include "hello_world.h"

int main() {
  hello_world();
  return 0;
}

GCCに配置すると、次のようになります。

 cc main.c -o main 
/tmp/ccSRLvFl.o:関数 `main ':
 main.c :(。text + 0x5):への未定義の参照hello_world '
 collect2:ldが1つの終了ステータスを返しました
 make:*** [main] Error 1 

誰でも私を助けることができますか?私は本当にこれにこだわっていますが、99%は本当に簡単な修正だと確信しています。

19
user1018501
gcc main.c hello_world.c -o main

また、常にヘッダーガードを使用します。

#ifndef HELLO_WORLD_H
#define HELLO_WORLD_H

/* header file contents go here */

#endif /* HELLO_WORLD_H */
38
Lundin

コンパイルにhello_world.cを含めていません。

   gcc hello_world.c main.c   -o main
8
P.P.

Hello_world.cにリンクしていません。

これを行う簡単な方法は、次のコンパイルコマンドを実行することです。

cc -o main main.c hello_world.c

より複雑なプロジェクトでは、多くの場合、コンパイルコマンドとリンクコマンドを分離するビルドスクリプトまたはメイクファイルを使用しますが、上記のコマンド(両方の手順を組み合わせたもの)は、小規模なプロジェクトには適しています。

5
Tom

2番目の.cファイルhello_world.cからコンパイルされたオブジェクトファイルをmain.oにリンクする必要があります。

これを試して

cc -c main.c
cc -c hello_world.c
cc *.o -o hello_world
4
vard

こんにちは、hello_world.cへのリンクを忘れているようです。私はgcc hello_world.c main.c -o mainになります。ファイルの数が少ない場合はこの方法を使用できますが、大規模なプロジェクトではMakeファイルまたはいくつかのコンパイルスクリプトを使用する方が適切です。

1
john