math.hを使用して、-lmなしでオブジェクトファイルをリンクします。

math.hを使用して、-lmなしでオブジェクトファイルをリンクします。

現在、Advanced Linuxプログラミングを読んでいますが、セクション2.3.3でmath.hの特定の機能を使用するには、オブジェクトファイルを-lmにリンクする必要があることがわかります。しかし、私はこの共有ライブラリの使用を指定せずにsqrt、pow、logなどのいくつかの数学関数を使用してきたと確信しています。

問題がどこにあるのかご存知ですか?

ありがとう

ベストアンサー1

コード/メイクファイルを移植可能に保つには、-lm関数を使用するときは常にfromを使用する必要があります。math.h

このヘッダーの一部はマクロ(明らかに追加のライブラリは必要ありません)ですが、いくつか(いくつかは除く)は指定されていません。他のいくつかの機能は、コンパイラによって組み込み(またはプロセッサ固有のオペコードに直接置き換えられます)、インライン機能などで実装できます。したがって、コードの正しい接続は、オプティマイザの設定と正確な内容によって異なります。コンパイラ/バージョンが使用中です。

たとえば、

#include <stdio.h>
#include <math.h>

int main()
{
    double d = 0.2;
    fprintf(stdout, "%f\n", sqrt(d));
    return 0;
}

LinuxでGCC 4.5.1を使用する:

$ gcc -o t t.c
/tmp/cczCfJsj.o: In function `main':
t.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status

$ gcc -O3 -o t t.c
# ok, compiled and linked fine

したがって、痛みを伴うことを避けるために-lm

おすすめ記事