1. ホーム
  2. c

[解決済み] 未定義の参照 'shm_open'、ここに -lrt フラグを追加済み。

2022-02-02 03:37:42

質問

システムがクラッシュし、Ubuntu 11.10を再インストールしたところ、私のコードでこの奇妙なエラーが発生しました。

どこに問題があるのかをテストするために、簡単なコードサンプルを書きました。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main (void) {

    int i;

    i = shm_open ("/tmp/shared", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);   printf ("shm_open rc = %d\n", i);

    shm_unlink ("/tmp/shared");

    return (0);
}

で、コンパイルコマンドは

gcc -lrt test.c -o test

というエラーが発生します。

/tmp/ccxVIUiP.o: In function `main':
test.c:(.text+0x21): undefined reference to `shm_open'
test.c:(.text+0x46): undefined reference to `shm_unlink'
collect2: ld returned 1 exit status

すでに -lrt lib を追加していますが、なぜまだコンパイルできないのですか?

解決方法を教えてください。

最後にライブラリ。

gcc test.c -o test -lrt

から GCCリンクオプション :

-llibrary
-l ライブラリ
    リンク時にlibraryという名前のライブラリを検索する。
    (ライブラリを別の引数として指定する2つ目の方法は
    はPOSIX準拠のためだけのものであり、推奨されません)。

    このオプションは、コマンドのどこに記述するかで違いがあります。
    リンカはライブラリやオブジェクト・ファイルを次の順序で検索・処理します。
    の順で指定されます。
    したがって、`foo.o -lz bar.o' はライブラリ `z' をファイル foo.o の後に検索し、かつ
    bar.oがzの関数を参照している場合、その関数はbar.oの前にあります。
    はロードされないかもしれません。