2011-11-25 13 views
10

私は現在gccをコンパイルするために<math.h>を使用する必要があります。 ライブラリを認識できないという問題があります。 私も-lmと何も試してみました。 私が使用しようとした機能はceil()だったと私は次のエラーを取得する:gccと-lmをリンクすると、Ubuntuでceil()が定義されない

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

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

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


私は<math.h>を含んでいました。また、私が使用するコマンドは以下のとおりであった:

gcc -lm -o fb file.c 
+4

使用している完全なコマンドラインを表示できますか? – Gian

+0

'ceil'を使う前に' #include 'を覚えましたか? –

+0

私はmath.hをインクルードしました また、使用したコマンドは gcc -lm -o fb file.c – drum

答えて

17

は、このコードを取り、ファイル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 

ワン。両方とも動作しない場合は、コンパイルごとに完全なエラーメッセージを表示します。ソースファイルの名前の後ろに-lmが表示されます(リンクする前にオブジェクトをコンパイルする場合は、オブジェクトファイル)。

+0

@ Johnathan Lefflerは、コンパイル中に毎回-lmを実行することなくこれを行う方法がありますか? – Brandon

+0

@Brandon:Macに移行しますか? ''の関数はメインシステムライブラリにありますので、 '-lm'を指定する必要はありません(ただし' -lm'を指定するとリンクするライブラリを与える 'libm.dylib'があります)コマンドラインで)。さもなければ、makefileを使用していることを確認し、それを保証するのに十分なだけの '' LDLIB '(または '' LDLIBES')を '-lm'に設定するか、ライブラリをインクルード/各プログラムによって必要とされる。つまり、「いいえ、それを指定するのを避ける方法はありません」。 GLibCチームになぜ彼らが単一のライブラリに行っていないのかを聞くことができます。 –

+0

コードを最適化すると、コンパイラがコンパイル時に 'ceil(1.2)'を評価し、実行時に関数を呼び出す必要がないことがあります。この場合、 '-lm'ライブラリが不要ですまったく。しかし、これは私の例で単純なプログラムのあいまいなケースになります - 一般的に、コンパイラはその最適化を行うことができませんし、関数がメインになければ数学ライブラリにリンクする必要がありますシステムライブラリ。 –

9

@Jonathan Lefflerの答えにコメントするほどの評判はありません。ちょうどPeter van der Lindenの本Expert C Programmingが第5章でこの問題に関する良い治療法を持っていると言いたいと思っています。Thinking of Linking

Archives (static libraries) are acted upon differently than are shared objects (dynamic libraries). With dynamic libraries, all the library symbols go into the virtual address space of the output file, and all the symbols are available to all the other files in the link. In contrast, static linking only looks through the archive for the undefined symbols presently known to the loader at the time the archive is processed.

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

2

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

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

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

+1

この質問は長い間答えられています。 – drum

関連する問題