質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

2回答

5447閲覧

makefileがうまく実行できない

marchan

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2021/12/24 08:29

編集2021/12/24 09:19

前提・実現したいこと

C言語のコードをmakefileを用いてコンパイルしたい。
make実行中に以下のようなエラーが生じた。

発生している問題・エラーメッセージ

> make gcc -o Sample Sample.o C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Sample.o:Sample.c:(.text+0x2f): undefined reference to `put_hai' collect2.exe: error: ld returned 1 exit status make: *** [Sample] エラー 1

該当のソースコード

Sample.c

C

1#include <stdio.h> 2#include <putkei.h> 3int main(){ 4 int a[3]={10,3,8}; 5 put_hai(3,a); 6}

GNUmakefile

# (1)コンパイラ CC = gcc # (2)コンパイルオプション CFLAGS = # (3)実行ファイル名 TARGET = Sample # (4)コンパイル対象のソースコード SRCS = Sample.c # (5)オブジェクトファイル名 OBJS = $(SRCS:.c=.o) # (6)インクルードファイルのあるディレクトリパス INCDIR = -I../../inc # (7)ライブラリファイルのあるディレクトリパス LIBDIR = # (8)追加するライブラリファイル LIBS = # (9)ターゲットファイル生成 $(TARGET): $(OBJS) $(CC) -o $@ $^ $(LIBDIR) $(LIBS) # (10)オブジェクトファイル生成 $(OBJS): $(SRCS) $(CC) $(CFLAGS) $(INCDIR) -c $(SRCS) # (11)"make all"で make cleanとmakeを同時に実施。 all: clean $(OBJS) $(TARGET) # (12).oファイル、実行ファイル、.dファイルを削除 clean: -rm -f $(OBJS) $(TARGET) *.d

putkei.c

C

1#include <stdio.h> 2void put_hai(int gyo,int *hyo){ 3 int i=0; 4 printf("{ %d",hyo[i]); 5 for(i=1;i<gyo;i++){ 6 printf(", %d",hyo[i]); 7 } 8 printf(" }\n"); 9}

putkei.h

h

1void put_hai(int gyo,int *hyo);

補足情報(FW/ツールのバージョンなど)

フォルダの構造は以下の通りです。

c_renshu | |- inc | |-putkei.c | |-putkei.h | |- mkfile_v |-renshu |-Sample.c |-GNUmakefile

GNUmakefileは以下のサイトのを参考にしました。
https://qiita.com/yagiyuki/items/ff343d381d9477e89f3b

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/12/24 09:07

「put_hai()」の定義は、どこでされてるのでしょうか?
marchan

2021/12/24 09:21 編集

putkei.cでしています。 しかし、putkei.cとputkei.hの内容を書き忘れていました。 該当のソースコードに追加しました
jbpb0

2021/12/24 09:37

「putkei.c」をコンパイルしてリンクしないといけないという情報が「makefile」に書かれてないので、その定義は使われず、 > undefined reference to `put_hai' となります ちゃんとmakeに教えてあげないと
guest

回答2

0

ベストアンサー

とりあえず、

Makefile

1# (4)コンパイル対象のソースコード 2SRCS = Sample.c ../../inc/putkei.c

でビルドできるようになるんじゃないかと思います。

が、GNUmakefile のディレクトリの外側にあるソースをコンパイルするのは妙です。とくに理由がないなら、putkei.h putkei.cSample.c と同じディレクトリに置いたほうがよいでしょう。

投稿2021/12/24 13:29

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marchan

2021/12/25 02:06

そうなんですね。知りませんでした。 ただ、putkei.h putkei.cは汎用的な自作ライブラリ的な感じで作ったので、できればディレクトリを分けたかったんですが不自然でしょうか?
int32_t

2021/12/25 02:34

その場合は inc/ にも Makefile を置いて、 renshu/GNUmakefile から inc/ の make を起動するのが一般的です。
guest

0

put_haiは、Sample.cに含まれておらず、従って、Sample.oに含まれていないので、Sample.o単独でリンクすると、put_haiが見つからないというエラーになります。

putkei.oも含めてリンクしないといけません。

投稿2021/12/24 10:44

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問