私のプロジェクトをコンパイルするためにMakefileを作成しようとしています。ただし、「math.h」ライブラリを使用するとmake
失敗します。 Makefileは次のようになります。
run: tema1
./tema1
build: tema1.c
gcc tema1.c -o tema1 -lm
clean:
rm *.o tema1
pow() と sqrt() を使用する私のコード部分は次のとおりです。
float score = sqrt(k) + pow(1.25, completed_lines);
ただし、「-lm」でコンパイルしても、次のエラーが発生します。
> /tmp/ccSQVWNy.o: In function `easy_win_score': tema1.c:(.text+0x1518):
> undefined reference to `sqrt' tema1.c:(.text+0x1540): undefined
> reference to `pow' collect2: error: ld returned 1 exit status
> <builtin>: recipe for target 'tema1' failed make: *** [tema1] Error 1
この問題の理由と解決策をご存知ですか?端末でこれを使用する場合:
gcc tema1.c -o tema1 -lm
動作しますが、Makefileでは失敗します。
ベストアンサー1
tema1
これは、MakefileがMakeの観点から構築する方法を説明していないために発生します。組み込みルール:
run
によって異なりますtema1
。tema1
定義はありませんが、Cファイルがあるため、Makeはデフォルトの規則です(unspecified-lm
。
この問題を解決するには、次のように話します。
tema1: tema1.c
gcc tema1.c -o tema1 -lm
build: tema1.c
待つ代わりに
自動変数を使用すると、重複を減らすことができます。
tema1: tema1.c
gcc $^ -o $@ -lm
「名前付け」ルール(run
などbuild
)を保持するには、特定のアーティファクトに依存するようにし(clean
何も作成しないので除く)、特定のアーティファクトに別のルールを追加し、「名前付け」ルールをfalseとしてマークします(Make対応するディスクアーティファクトは予想されません):
build: tema1
tema1: tema1.c
gcc $^ -o $@ -lm
.PHONY: run build clean
clean
清掃することがないときに失敗しないように変更することも価値があります。
clean:
rm -f *.o tema1