問題ID : 9056 Makefileのサンプルコードについて

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
depth:
0
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-9-11 8:24
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]$
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-9-11 9:57
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!);
みると、バックスラッシュ(\)やダブルクオーテーション(”)が無いように見えるのですが…
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-9-11 20:06
20160220  新米   投稿数: 5
arashi1977様御回答ありがとうございます。
おっしゃる通りダブルコーテーションやバックスラがありません。
ファイルは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
ファイル src_b.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)
depth:
3
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-9-11 22:02
arashi1977  長老 居住地: 広島  投稿数: 1715
動作検証して掲載するだろうに、そんなしょうもないエラー発生するって変だなぁと思って見てみたら、旧問題集(ID:29151)の参考ではちゃんとバックスラッシュによるエスケープがありますね。
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
旧問題集のほうに掲載されているMakefileのサンプルだとちゃんと動くとかありますか?
depth:
4
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-9-11 23:06
20160220  新米   投稿数: 5
旧問題集(ID:29151)の参考の方のコードで実施してみました。
エラーコードが出ていないので上手く動作したように見受けられます。

[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
==========make generateでできたファイルに""とバックスラがある。==========
[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]$

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.