1

2つのファイル->fact.hとフォルダmain.cがあります。の関数を呼び出すmain関数があります。arコマンドでアーカイブを作成しています->/home/snyp1/newmain.cfact(int x)fact.h.a

snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h  fact.o  libfact.a  main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

私はubuntu12.04にいます。何が悪いのか教えてください。(また、私がを使用しない場合-L/.../new、gccは「lfact」を見つけることができないと言います。おそらくそれがないためです/usr/local/lib

編集:OK私は原因を見つけました。fact.hこれは、をビルドfact.oしてライブラリに配置するために使用していたため、期待どおりに機能していませんでした。だから私は今それをに変更しfile.c、今はうまく働いています。その情報を提供するべきだった、ごめんなさい。なぜこのような問題が発生するのかはわかりませんが。少なくとも1つの.cファイルがなくてもライブラリを作成することはできませんか?

4

2 に答える 2

2

fact.hを使用してfact.oをビルドし、それをライブラリに配置していましたが、期待どおりに機能していませんでした。

コンパイルfact.hして制作していたということfact.oですか?

もしそうなら、それはあなたが期待することをしていませんでした。ヘッダーファイルを呼び出すと、オブジェクトファイルではなくgcc、プリコンパイル済みヘッダーが生成されます。したがって、というファイルを取得しましたが、それは有効なオブジェクトファイルではありませんでした。実行したばかりの場合は、プリコンパイル済みヘッダーが生成されますが、おそらく実行したため、ファイルはまだプリコンパイル済みヘッダーであるにもかかわらず呼び出されます。 それを示したでしょう:foo.ogcc -c fact.hfact.gchgcc -c fact.h -o fact.ofact.ofile fact.o

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

実行することで、GCCにファイルをヘッダーではなくCコードとして処理させることもできますがgcc -x c -c fact.h -o fact.o-x cファイル拡張子からタイプを推測するのではなく、入力をCコードとして処理するように指示されます)、名前を付けるだけの方が簡単で混乱が少ないでしょう。ヘッダーをコンパイルしようとする代わりに、正しくファイルします。

少なくとも1つの.cファイルが含まれていないライブラリを作成することはできませんか?

少なくとも1つのオブジェクトファイル(つまり.oファイル)が必要ですが、有効なオブジェクトがなく、誤解を招くような名前のプリコンパイル済みヘッダー.oがありましたが、実際にはオブジェクトファイルではありませんでした。

を使用しない場合-L/.../new、gccは「lfact」が見つからないと表示します。/usr/local/lib

リンカは調べるだけでなく/usr/local/lib、他にもデフォルトの場所がありますが、基本的にはそれが問題です。ライブラリが現在のディレクトリにあるかどうかも言うことができることに注意してください-L.。これは絶対パスを指定するよりも簡単です。

于 2012-07-29T01:29:06.680 に答える
1

ar最初のオプション以外でダッシュをサポートするかどうかはわかりません。試す

ar -rs libfact.a fact.o

あるいは単に

ar rs libfact.a fact.o

ranlib念のために言っておきますが、なぜランニングがうまくいかなかったのかわかりません。

于 2012-07-28T23:27:12.783 に答える