gccと-lmをリンクすると、Ubuntuでceil()が定義されません。

I am currently using gcc to compile and I need to use . Problem is that it won't recognize the library. I have also tried -lm and nothing. The function I tried to use was ceil() and I get the following error:

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

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

誰もがこの問題を解決する方法を知っていますか?


I did include . Also, the command I used was:

gcc -lm -o fb file.c
11
ソースファイル名の後に -lm を指定しましたか?
追加された 著者 Keith Thompson,
あなたの問題があります - ソースファイル名の後ろにライブラリを指定してください。
追加された 著者 Jonathan Leffler,
実際には、 -lm オプションはフラグであると言う強力なケースがあります。それらは -l m と書くこともできます(しかし、まれに書かれることはまれです)。また、記述する振る舞いは、静的ライブラリ(Unixでは .a )では正しくありますが、実際には共有ライブラリには当てはまりません。
追加された 著者 Jonathan Leffler,
@rum -l <​​/ code>はフラグではなく、ライブラリ名であり、関連性があります。ライブラリに不要なものはすべてすぐに破棄されるからです。後で不必要ではないと判明した場合、それは遅すぎる。
追加された 著者 glglgl,
あなたが使用している完全なコマンドラインを与えることはできますか?
追加された 著者 Gian,
ceil を使う前に #include を覚えていましたか?
追加された 著者 David Schwartz,
gcc への引数の順序は大したことです。
追加された 著者 Basile Starynkevitch,
私はmath.hを含んでいた。また、私が使用したコマンドは:gcc -lm -o fb file.c
追加された 著者 drum,
@JonathanLefflerありがとう!フラグの順序が重要だとは思わなかった。
追加された 著者 drum,

3 答え

このコードをとり、 ceil.c ファイルに入れます:

#include 
#include 
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 が表示されます(リンクする前にオブジェクトをコンパイルする場合はオブジェクトファイル)。

19
追加された
@Brandon:Macに移行する?メインのシステムライブラリに の関数があるので、 -lm を指定する必要はありません(ただし、 libm.dylib -lm を指定した場合にリンクするライブラリを提供します)。それ以外の場合は、makefileを使用していることを確認し、十分に使用している場合は LDLIB LDLIBES )を -lm それは - 各プログラムの必要に応じてライブラリを含む/除外するプログラムごとのルールを書くこと。つまり、「いいえ、それを指定するのを避ける方法はありません」。 GLibCチームになぜ彼らが単一のライブラリに行っていないのかを聞くことができます。
追加された 著者 Jonathan Leffler,
コードを最適化すると、コンパイラはコンパイル時に ceil(1.2)を評価し、実行時に関数を呼び出す必要がないことに注意してください。この場合、 code> -lm ライブラリを使用してください。しかし、これは私の例で単純なプログラムのあいまいなケースになります - 一般的に、コンパイラはその最適化を行うことができませんし、関数がメインになければ数学ライブラリにリンクする必要がありますシステムライブラリ。
追加された 著者 Jonathan Leffler,
ありがとう!私はファイルの後ろにフラグを置いていなかった。
追加された 著者 Flipbed,
@ Johnathan Lefflerはコンパイル中に毎回lpを使わずにこれを行う方法がありますか?
追加された 著者 Brandon,

Don't have enough reputation to comment on @Jonathan Leffler's answer. Just wanted to mention that Peter van der Linden's book Expert C Programming has a good treatment on this subject in chapter 5 Thinking of Linking.

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

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

9
追加された

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

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

私は同じ問題を抱えていて、このコマンドを使って解決しました。同じ日にあなたのUbuntuをインストールした場合、それは問題を抱えている可能性があります。

2
追加された
この質問は長い間答えられています。
追加された 著者 drum,