3

静的ライブラリの使用方法を理解しようとしていますが、最も簡単な例は失敗します。

//foo.c
int func(int i) {
  return i+1;
}
//main.c
int func(int i);
int main() {
  return func(41);
}

コンパイルfoo.cmain.c動作:

gcc -Wall -o foo.o -c foo.c
gcc -Wall -o main.o -c main.c

アーカイブfoo.oも文句を言いません:

ar rcs libfoo.a foo.o

しかし、リンクは次への未定義の参照で失敗しますfunc

ld libfoo.a main.o
ld -L. -lfoo main.o

両方とも私に:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'

gccリンクを経由して迂回すると、同様のエラーが発生します。

gcc libfoo.a main.o
gcc -L. -lfoo main.o

ください:

main.o: In function `main':
main.c:(.text+0xa): undefined reference to `func'
collect2: ld returned 1 exit status

私はここで何が間違っているのですか?私が読んだ/使用したすべてのマニュアルと検索エンジンによると、これは静的ライブラリを使用する方法です。


gcc foo.o main.o編集:完全にうまく機能する心。

4

1 に答える 1

3

愚かなことを何度も試した後、最も愚かなアイデアは解決策でした。ld最初にオブジェクトファイルが必要で、次にアーカイブが必要です。わーい!

gcc libfoo.a main.o  // fails
gcc main.o libfoo.a  // works

-L.とでライブラリを指定した場合も同様です-lfoo。どこに配置するか-Lは明らかに重要ではありませんが、ファイルを直接-lfoo指定する場合と同じ程度に問題を配置します。.a

于 2011-10-30T14:11:38.230 に答える