36

わかりました、私はこれを最も長い間使用しようとしてきましたが、正しく機能させることができないようです. 、、、の 3 つのファイルがmain.cありhello_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 メイン
/tmp/ccSRLvFl.o: 関数「main」内:
main.c:(.text+0x5): `hello_world' への未定義の参照
collect2: ld が 1 つの終了ステータスを返しました
make: *** [メイン] エラー 1

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

4

5 に答える 5

50
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 */
于 2012-04-27T20:07:54.363 に答える
9

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

   gcc hello_world.c main.c   -o main
于 2012-04-27T20:08:10.807 に答える
5

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

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

cc -o main main.c hello_world.c

より複雑なプロジェクトでは、多くの場合、ビルドスクリプトを使用するか、コンパイルコマンドとリンクコマンドを分離するファイルを作成しますが、上記のコマンド(両方の手順を組み合わせたもの)は、小さなプロジェクトでは問題なく機能します。

于 2012-04-27T20:08:43.507 に答える
4

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

これを試して

cc -c main.c
cc -c hello_world.c
cc *.o -o hello_world
于 2012-04-27T20:07:12.920 に答える
1

hello_world.c へのリンクを忘れているようです。gcc hello_world.c main.c -o main になります。ファイルの数が少ない場合はこのアプローチを使用できますが、大規模なプロジェクトでは Make ファイルまたはコンパイル スクリプトを使用することをお勧めします。

于 2012-04-28T08:44:18.407 に答える