1. ホーム
  2. c

[解決済み] Ubuntuで、gccと-lmでリンクするとceil()が定義されない。

2022-02-25 14:32:46

質問

現在gccでコンパイルしていますが <math.h> . 問題は、ライブラリが認識されないことです。 また -lm と表示され、何も表示されません。 私が使おうとした関数は ceil() と表示され、以下のエラーが発生します。

: undefined reference to `ceil'
collect2: ld returned 1 exit status

最新のUbuntuを使用しており、math.hはあります。 私は -lm を別のコンピュータで使用したところ、完全に動作しました。

この問題を解決する方法をご存知の方はいらっしゃいますか?


私は <math.h> . また、使用したコマンドは

gcc -lm -o fb file.c

解決方法は?

このコードをファイルに保存してください。 ceil.c :

#include <math.h>
#include <stdio.h>
int main(void)
{
    printf("%f\n", ceil(1.2));
    return 0;
}

でコンパイルしてください。

$ gcc -o ceil ceil.c
$ gcc -o ceil ceil.c -lm

この2つのうち、どちらかが動作するはずです。 どちらも動作しない場合は、それぞれのコンパイル時のエラーメッセージをすべて表示します。 以下のことに注意してください。 -lm はソースファイル名(ソースをオブジェクトにコンパイルしてからリンクした場合はオブジェクトファイル名)の後に表示されます。

注意事項

  1. 最近のコンパイラは、2.0を直接 printf() を呼び出すことなく ceil() を実行時に全く使用しないので、数学ライブラリは全く必要ありません。

  2. ルールオブサム オブジェクトファイルやソースファイルをライブラリより先にコマンドラインにリストアップします。 この回答では、使用中 -lm はソースファイルの後に来る ceil.c . でビルドしている場合は make などを使用する場合、通常は ceil.o をコマンドラインで (他のオブジェクトファイルと一緒に) 表示します。通常、ライブラリの前にすべてのオブジェクトファイルを表示する必要があります。

しかし、それは稀なケースであり、例外が予想される/要求される特定のケースについて文書化されるでしょう。 例外を示す明確な文書がない場合は、経験則を適用してください。