問題ID : 9056 Makefileのサンプルコードについて
- フォーラムは新サイトへ移行しました。
- このフォーラムではゲスト投稿が禁止されています
20160220
投稿数: 5
この問題の参考部分にサンプルコードがついておりまして、そちらを実行時に下記のようにエラーになってしまいます。
make generate コマンドは問題なく実行できているように見えますが、makeコマンドをたたくとエラーになってしまいます。
自分の環境のせいかと思いますので問題の切り分けのためにどなたかサンプルコードを実行してみてもらえませんか?
また、ここがおかしい等指摘事項があればコメントしていただければ幸いです。
宜しくお願い致します。
■試したこと
windowsとlinuxの改行コードが怪しいと考えてVScodeでCRLF→LFに変換 (変化なし)
yum update → yum install make gcc
パッケージ gcc-4.8.5-44.el7.x86_64 はインストール済みか最新バージョンです
パッケージ 1:make-3.82-24.el7.x86_64 はインストール済みか最新バージョンです
=======実行環境========
[centos@localhost maketest]$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[centos@localhost maketest]$ uname -a
Linux localhost.localdomain 3.10.0-1160.36.2.el7.x86_64 #1 SMP Wed Jul 21 11:57:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
==========実行時のログ==========
[centos@localhost maketest]$ vi Makefile
[centos@localhost maketest]$ make generate
Generate src_main.c
Generate src_a.c
Generate src_b.c
Generate src_b.h
[centos@localhost maketest]$ ls
Makefile src_a.c src_b.c src_b.h src_main.c
[centos@localhost maketest]$ ls -l
合計 20
-rw-rw-r--. 1 centos centos 1254 9月 11 08:02 Makefile
-rw-rw-r--. 1 centos centos 105 9月 11 08:02 src_a.c
-rw-rw-r--. 1 centos centos 111 9月 11 08:02 src_b.c
-rw-rw-r--. 1 centos centos 56 9月 11 08:02 src_b.h
-rw-rw-r--. 1 centos centos 46 9月 11 08:02 src_main.c
[centos@localhost maketest]$
[centos@localhost maketest]$ make
gcc -c -o src_a.o src_a.c
src_a.c: 関数 ‘function_a’ 内:
src_a.c:3:18: エラー: expected expression before ‘%’ token
fprintf(stdout, %sn, This line comes from src_a.c!);
^
make: *** [src_a.o] エラー 1
[centos@localhost maketest]$
make generate コマンドは問題なく実行できているように見えますが、makeコマンドをたたくとエラーになってしまいます。
自分の環境のせいかと思いますので問題の切り分けのためにどなたかサンプルコードを実行してみてもらえませんか?
また、ここがおかしい等指摘事項があればコメントしていただければ幸いです。
宜しくお願い致します。
■試したこと
windowsとlinuxの改行コードが怪しいと考えてVScodeでCRLF→LFに変換 (変化なし)
yum update → yum install make gcc
パッケージ gcc-4.8.5-44.el7.x86_64 はインストール済みか最新バージョンです
パッケージ 1:make-3.82-24.el7.x86_64 はインストール済みか最新バージョンです
=======実行環境========
[centos@localhost maketest]$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[centos@localhost maketest]$ uname -a
Linux localhost.localdomain 3.10.0-1160.36.2.el7.x86_64 #1 SMP Wed Jul 21 11:57:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
==========実行時のログ==========
[centos@localhost maketest]$ vi Makefile
[centos@localhost maketest]$ make generate
Generate src_main.c
Generate src_a.c
Generate src_b.c
Generate src_b.h
[centos@localhost maketest]$ ls
Makefile src_a.c src_b.c src_b.h src_main.c
[centos@localhost maketest]$ ls -l
合計 20
-rw-rw-r--. 1 centos centos 1254 9月 11 08:02 Makefile
-rw-rw-r--. 1 centos centos 105 9月 11 08:02 src_a.c
-rw-rw-r--. 1 centos centos 111 9月 11 08:02 src_b.c
-rw-rw-r--. 1 centos centos 56 9月 11 08:02 src_b.h
-rw-rw-r--. 1 centos centos 46 9月 11 08:02 src_main.c
[centos@localhost maketest]$
[centos@localhost maketest]$ make
gcc -c -o src_a.o src_a.c
src_a.c: 関数 ‘function_a’ 内:
src_a.c:3:18: エラー: expected expression before ‘%’ token
fprintf(stdout, %sn, This line comes from src_a.c!);
^
make: *** [src_a.o] エラー 1
[centos@localhost maketest]$
Re: 問題ID : 9056 Makefileのサンプルコードについて
msg# 1.1
arashi1977
居住地: 広島
投稿数: 1715
引用:の直下でコードの中身が表示されてますが、そのとおりになってますか?なんか
みると、バックスラッシュ(\)やダブルクオーテーション(”)が無いように見えるのですが…
各ソースファイルのコンパイルと、実行ファイルである「maketest.bin」が作成されました。このプログラムが実行できることを確認してみます。
src_a.c: 関数 ‘function_a’ 内:
src_a.c:3:18: エラー: expected expression before ‘%’ token
fprintf(stdout, %sn, This line comes from src_a.c!);
Re: 問題ID : 9056 Makefileのサンプルコードについて
msg# 1.1.1
20160220
投稿数: 5
arashi1977様御回答ありがとうございます。
おっしゃる通りダブルコーテーションやバックスラがありません。
ファイルはmake generate実行時に作成されるため、作成された段階でこの状態になります。
c言語については疎いので内容は分かっていないのですがbashのように「バックスラを文字列として扱いたい場合はバックスラバックスラにする」みたいなルールがあるのでしょうか?
ファイル src_a.c
サンプルコード該当部分?
ファイル src_b.c
サンプルコード該当部分?
長いですが、実際に使用しているMakefileです。
vimの画面上は¥はバックスラで表示されています。
おっしゃる通りダブルコーテーションやバックスラがありません。
ファイルはmake generate実行時に作成されるため、作成された段階でこの状態になります。
c言語については疎いので内容は分かっていないのですがbashのように「バックスラを文字列として扱いたい場合はバックスラバックスラにする」みたいなルールがあるのでしょうか?
ファイル src_a.c
include <stdio.h>
int function_a() {
fprintf(stdout, %sn, This line comes from src_a.c!);
return 0;
}
@echo " fprintf(stdout, "%s\n", "This line comes from src_a.c!");" >> src_a.c
#include <stdio.h>
#include src_b.h
int function_b() {
fprintf(stdout, %sn, FUNCTION_B_STRINGS);
return 0;
}
@echo " fprintf(stdout, "%s\n", FUNCTION_B_STRINGS);" >> src_b.c
長いですが、実際に使用しているMakefileです。
vimの画面上は¥はバックスラで表示されています。
BJS = src_a.o src_b.o src_main.o
CC = gcc
PROGRAM = maketest.bin
DESTDIR = $(HOME)/bin
CHK_INSTALL = .installed
.SUFFIXES: .c .o
$(PROGRAM): $(OBJS)
$(CC) -o $(PROGRAM) $^
.c .o:
$(CC) -c $<
install: $(PROGRAM)
mkdir -p $(DESTDIR)
install $(PROGRAM) $(DESTDIR)
touch $(CHK_INSTALL)
uninstall: $(CHK_INSTALL)
rm $(DESTDIR)/$(PROGRAM)
rm $(CHK_INSTALL)
.PHONY: clean generate clean-gen
generate:
@echo Generate src_main.c
@echo "void main()" { > src_main.c
@echo " function_a();" >> src_main.c
@echo " function_b();" >> src_main.c
@echo } >> src_main.c
@echo Generate src_a.c
@echo "#include <stdio.h>" > src_a.c
@echo "int function_a()" { >> src_a.c
@echo " fprintf(stdout, "%s\n", "This line comes from src_a.c!");" >> src_a.c
@echo " return 0;" >> src_a.c
@echo } >> src_a.c
@echo Generate src_b.c
@echo "#include <stdio.h>" > src_b.c
@echo "#include "src_b.h"" >> src_b.c
@echo "int function_b()" { >> src_b.c
@echo " fprintf(stdout, "%s\n", FUNCTION_B_STRINGS);" >> src_b.c
@echo " return 0;" >> src_b.c
@echo } >> src_b.c
@echo Generate src_b.h
@echo "#define FUNCTION_B_STRINGS "This line comes from src_b.h"" > src_b.h
clean-gen:
$(RM) src_main.c src_a.c src_b.c src_b.h
clean:
$(RM) $(PROGRAM) $(OBJS)
Re: 問題ID : 9056 Makefileのサンプルコードについて
msg# 1.1.1.1
arashi1977
居住地: 広島
投稿数: 1715
動作検証して掲載するだろうに、そんなしょうもないエラー発生するって変だなぁと思って見てみたら、旧問題集(ID:29151)の参考ではちゃんとバックスラッシュによるエスケープがありますね。
旧問題集のほうに掲載されているMakefileのサンプルだとちゃんと動くとかありますか?
generate:
@echo Generate src_main.c
@echo "void main()" { > src_main.c
@echo " function_a();" >> src_main.c
@echo " function_b();" >> src_main.c
@echo } >> src_main.c
@echo Generate src_a.c
@echo "#include <stdio.h>" > src_a.c
@echo "int function_a()" { >> src_a.c
@echo " fprintf(stdout, \"%s\n\", \"This line comes from src_a.c!\");" >> src_a.c ←こことか
@echo " return 0;" >> src_a.c
@echo } >> src_a.c
@echo Generate src_b.c
@echo "#include <stdio.h>" > src_b.c
@echo "#include \"src_b.h\"" >> src_b.c ←こことか
@echo "int function_b()" { >> src_b.c
@echo " fprintf(stdout, \"%s\n\", FUNCTION_B_STRINGS);" >> src_b.c ←こことか
@echo " return 0;" >> src_b.c
@echo } >> src_b.c
Re: 問題ID : 9056 Makefileのサンプルコードについて
msg# 1.1.1.1.1
20160220
投稿数: 5
旧問題集(ID:29151)の参考の方のコードで実施してみました。
エラーコードが出ていないので上手く動作したように見受けられます。
==========make generateでできたファイルに""とバックスラがある。==========
=======makeコマンドの実行========
エラーコードが出ていないので上手く動作したように見受けられます。
[centos@localhost maketest-old]$ make generate
Generate src_main.c
Generate src_a.c
Generate src_b.c
Generate src_b.h
[centos@localhost maketest-old]$ ls -l
合計 20
-rw-rw-r--. 1 centos centos 1262 9月 11 22:50 Makefile
-rw-rw-r--. 1 centos centos 110 9月 11 22:51 src_a.c
-rw-rw-r--. 1 centos centos 116 9月 11 22:51 src_b.c
-rw-rw-r--. 1 centos centos 58 9月 11 22:51 src_b.h
-rw-rw-r--. 1 centos centos 46 9月 11 22:51 src_main.c
[centos@localhost maketest-old]$ cat src_a.c
#include <stdio.h>
int function_a() {
fprintf(stdout, "%s\n", "This line comes from src_a.c!");
return 0;
}
[centos@localhost maketest-old]$ cat src_b.c
#include <stdio.h>
#include "src_b.h"
int function_b() {
fprintf(stdout, "%s\n", FUNCTION_B_STRINGS);
return 0;
}
[centos@localhost maketest-old]$ cat src_b.h
#define FUNCTION_B_STRINGS "This line comes from src_b.h"
=======makeコマンドの実行========
[centos@localhost maketest-old]$ make
gcc -c -o src_a.o src_a.c
gcc -c -o src_b.o src_b.c
gcc -c -o src_main.o src_main.c
gcc -o maketest.bin src_a.o src_b.o src_main.o
[centos@localhost maketest-old]$
[centos@localhost maketest-old]$
[centos@localhost maketest-old]$ ./maketest.bin
This line comes from src_a.c!
This line comes from src_b.h
[centos@localhost maketest-old]$