-私のMakefileではlmが動作しません。

-私のMakefileではlmが動作しません。

私のプロジェクトをコンパイルするために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

おすすめ記事