1

奇妙な "undefined reference to" コンパイル エラーが発生し、解決策が見つからないようです。Yocto Project で生成された ARM コンパイラ (arm-poky-linux-gnueabi-gcc) を使用して Gumstix Overo 用に PAM 1.1.6 を構成/コンパイルしようとしていますが、コンパイル中に次のエラーが発生し続けます。

.libs/pam_rhosts.o: In function `pam_sm_authenticate':
modules/pam_rhosts/pam_rhosts.c:117: undefined reference to `ruserok'
collect2: error: ld returned 1 exit status

そのため、いくつか調査を行ったところ、configure 中に次のテスト コードがコンパイルおよび実行され、ruserok、ruserok_af、および iruserok の可用性が判断されることがわかりました。

/* end confdefs.h.  */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
#define $2 innocuous_$2

/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $2 (); below.
    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
    <limits.h> exists even on freestanding compilers.  */

#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif

#undef $2

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char $2 ();
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined __stub_$2 || defined __stub___$2
choke me
#endif

int
main ()
{
return $2 ();
  ;
  return 0;
}

そこで、生成された GCC コンパイラを使用して、このコードをコピーして貼り付け (すべての $2 を ruserok に置き換えます)、コンパイルしました。

./arm-poky-linux-gnueabi-gcc -o test.o test.c

ruserok、ruserok_af、および iuserok 関数が存在するかどうかを確認したところ、次のコンパイル エラーが発生しました。

/tmp/ccU8YszI.o: In function `main':
test.c:(.text+0x8): undefined reference to `ruserok'
collect2: error: ld returned 1 exit status

これは、上記と同じ「`ruserok' への未定義参照」エラーです。健全性チェックとして、以前に Ubuntu ソフトウェア センターから Ubuntu/Linaro ARM GCC コンパイラをインストールしていたので、同じコードを arm-linux-gnueabi-gcc コンパイラでコンパイルしましたが、コードはエラーなしで正常にコンパイルされました。ここで私が参照のために使用したコマンド:

arm-linux-gnueabi-gcc -o test.o test.c

ですから、私の質問は次のとおりです。一方のコンパイラが「ruserok への未定義の参照」エラーを生成し、もう一方のコンパイラは生成しないのはなぜですか? または別の質問として、一方のコンパイラーが「ruserok への未定義の参照」エラーを生成するという 2 つのコンパイラーの違いは何ですか?

4

1 に答える 1

0

コンパイラ (特にgcc) は、単なるコード ジェネレータではありません。彼らはlibc、つまり標準Cライブラリーとlibgccコンパイラー・ヘルパー・ライブラリーに精通しています。一般的なコマンド ラインは暗黙的に使用します( libc-lcとのリンク)。from Ubuntu は、 eglibc を使用した crosstool-ngビルドですarm-linux-gnueabi-gcc

Poky gccが何であるかはわかりません。コンパイラを入手した場所へのリンクを提供する場合があります。Poky 構成リンクから、コンパイラはマルチライブラリ ディストリビューションか何かであり、おそらくクロスビルドを構成するために実行する必要がある追加の手順があるようです。

質問への答えは、

あるコンパイラでは "undefined reference to ruserok" エラーが生成され、他のコンパイラでは生成されないのはなぜですか?

一方はruserokライブラリにあり、もう一方はライブラリにない (または表示するように構成されていない) ためです。

于 2013-04-08T23:01:50.610 に答える