プロが教える店舗&オフィスのセキュリティ対策術

Eclipse 3.5 Galileo + CDT + cygwinで、CやC++のプログラムを作りたいと考えています。
しかし、ビルドが通らず、困っています。

行った作業手順は、以下の通りです。


(1)まず、下記サイトを参考に、簡単なCプログラムを作りました。
 http://www.c.csce.kyushu-u.ac.jp/~seiichirou/wik …

 ----以下、作成したプログラム----
 /* hello.c */
 #include <stdio.h>

 void edajima(void);

 int main(int argc, char* argv[]) {
  edajima();
  return 0;
 }

 /* edajima.c */
 #include <stdio.h>

 void edajima(void);

 void edajima(void) {
  printf("わしが男塾塾長 江田島平八である!!\r\n");
 }

 ----プログラムここまで----

(2)そして、Makefileを以下のように作成しました。

 ----以下、Makefile----
 # Makefile
 CC = gcc

 CXXFLAGS =-O2 -g -Wall -fmessage-length=0

 OBJS =edajima.o hello.o

 LIBS =

 TARGET =hello.exe

 $(TARGET):$(OBJS)
 $(CC) -o $(TARGET) $(OBJS) $(LIBS)

 all:$(TARGET)

 hello.o: hello.c
 $(CC) -c hello.c

 edajima.o: edajima.c
 $(CC) -c edajima.c

 clean:
 rm -f $(OBJS) $(TARGET)
 ----Makefileここまで----

(3)次に、EclipseでCのMakefileプロジェクトの作成をしました。
  ロケーションは、上記ソースやMakefileがあるディレクトリを指定しました。

(4)Eclipseのプロジェクトエクスプローラで、Makefileを右クリックし、[Makeターゲット]-[作成]
  でMakeターゲットを作成しました。

(5)Makefileを右クリックし、[Makeターゲット]-[ビルド]を実行すると、下記エラーが出て、
  ビルドに失敗しました。

 make hello
 gcc -c hello.c
 gcc hello.o -o hello
 hello.o:hello.c:(.text+0x17): undefined reference to `_edajima'
 collect2: ld returned 1 exit status
 make: *** [hello] Error 1

どうやら、edajima.cがコンパイルされていない様です。
cygwin上でmakeコマンドを実行すると、ビルドできるので、Makefileは間違っていないと思っているのですが・・・。

どなたか、分かる方、ご教授願います。

A 回答 (3件)

手前でも、試してみました。



手前では、特に問題なく、ビルドも実行も出来ましたが、

ビルド時のメッセージに違いがあるみたいです。
make all
gcc -c edajima.c
gcc -c hello.c
gcc -o hello.exe edajima.o hello.o

と言う風なビルド時のメッセージでした。

ので、もしかすると、

> (4)Eclipseのプロジェクトエクスプローラで、Makefileを右クリックし、[Makeターゲット]-[作成]
>   でMakeターゲットを作成しました。
作成するべきMakeターゲットは「all」であるはずなんですが、
「hello」とかを作っちゃったのではないですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
その通りでした。helloをターゲットにしていました。
allにしたら、コンパイルは通ったのですが、
「必要なプロジェクトにエラーがあります。起動しますか?」と聞かれ、
「はい」を押すと、無事に実行されるみたですが、「問題」のビューに
「make; ***No rule to make target `all'」と表示されます。
何ででしょう?

お礼日時:2010/04/30 23:11

> 「make; ***No rule to make target `all'」と表示されます。


> 何ででしょう?
make ターゲット「all」のルールが無いと言っているみたいです。

Makefile を編集したんじゃないですか?

この回答への補足

ありがとうございます。
Makefileは、変更していないんですよね・・・・。
一旦、cleanを実行して、allを実行すると、エラーが無く、コンパイルは通るんです。
all実行時のコンソールの内容は、下記のようになります。
----------------------------
make all
g++ -c edajima.c
g++ -c hello.c
g++ -o hello.exe edajima.o hello.o
----------------------------
その後、Eclipseの実行を押すと、
「必要なプロジェクトにエラーがあります。起動しますか?」と表示されます。
この時のコンソールの内容は、下記のようになります。
----------------------------
make all
make: *** No rule to make target `all'. Stop.
----------------------------

なぜか、実行時に再度make allされて、失敗している様です。
[プロジェクト]-[自動的にビルド]のチェックは外しているんですが・・・。

補足日時:2010/05/01 09:29
    • good
    • 0
この回答へのお礼

すいません、自己解決しました。
プロジェクトのプロパティーの[C/C++ビルド]-[ビルダー設定]でビルド・ディレクトリーをMakefileがある場所に設定したら、エラーが出なくなりました。

ありがとうございました。

お礼日時:2010/05/01 09:38

hello.cにある


> void edajima(void);


extern void edajima(void);

に変えてみてください。

同じファイルの中に無いものはexternで外部参照を宣言しておく必要があります。

この回答への補足

ありがとうございます。

extern void edajima(void);
に変えましたが、結果は同じでした。

gcc -c hello.c
の後に
gcc hello.o -o hello
となってしまい、
gcc -c edajima.c
の処理が走らないのは、なぜでしょうか?

補足日時:2010/04/29 22:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!