web-dev-qa-db-ja.com

gccおよび-lmとリンクしても、Ubuntuでceil()が定義されない

現在、コンパイルに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
_
15
drum

このコードを取得してファイルに入れます_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つのうちの1つが機能するはずです。どちらも機能しない場合は、各コンパイルの完全なエラーメッセージを表示します。 _-lm_は、ソースファイル(またはリンクする前にソースをオブジェクトにコンパイルする場合はオブジェクトファイル)の名前の後に表示されることに注意してください。

ノート:

  1. 最新のコンパイラは、実行時にprintf()をまったく呼び出さずに、2.0をceil()に直接渡すようにコードを最適化する可能性があるため、数学ライブラリはまったく必要ありません。

  2. 経験則:ライブラリの前のコマンドラインにオブジェクトファイルとソースファイルを一覧表示します。この回答は、使用中:_-lm_がソースファイル_ceil.c_の後に来ることを示しています。 makeなどを使用してビルドしている場合は、通常、コマンドラインで(他のオブジェクトファイルとともに)_ceil.o_を使用します。通常、ライブラリの前にすべてのオブジェクトファイルをリストする必要があります。

経験則に例外がある場合もありますが、それらはまれであり、例外が予想される/必要とされる特定の場合について文書化されます。反対の明確な文書がない場合は、経験則を適用してください。

21

@JonathanLefflerの回答にコメントするのに十分な評判がありません。 Peter van der Lindenの本 Expert C Programming は、第5章 Thinking of Linking でこの主題について良い扱いをしていることを述べたかっただけです。

アーカイブ(静的ライブラリ)は、共有オブジェクト(動的ライブラリ)とは異なる方法で動作します。ダイナミックライブラリでは、すべてのライブラリシンボルが出力ファイルの仮想アドレス空間に入り、すべてのシンボルはリンク内の他のすべてのファイルで使用できます。対照的に、静的リンクは、アーカイブの処理時にローダーに現在認識されている未定義のシンボルをアーカイブ内でのみ検索します。

オブジェクトファイルの前に数学ライブラリ(通常は静的ライブラリ)を指定すると、リンカはシンボルを追加しません。

9
Daniel Näslund

そのようにコンパイルしてみてください:

gcc -Wall -g file.c -lm -o file

同じ問題が発生しましたが、このコマンドを使用して解決しました。また、問題が発生した同じ日にUbuntuをインストールした場合は、更新の問題である可能性があります。

4
user4371544