なしで静的ライブラリを作成することは許可されていません。その中のcファイル?
-
13-12-2019 - |
質問
私は2つのファイルを持っています-> fact.h
と main.c
の中で /home/snyp1/new
フォルダ。 main.c
を呼び出すmain関数を持っています fact(int x)
での機能 fact.h
.私は作成しています .a
arコマンドでアーカイブ->
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
その中のファイル?
解決
私はfactを使用していました。事実を構築するためにh。oそしてそれをライブラリに入れると、期待どおりに機能しませんでした。
あなたがコンパイルしていたことを意味しますか fact.h
生産する fact.o
?
もしそうなら、それはあなたが期待することをしていませんでした。あなたが呼び出すとき gcc
ヘッダーファイルでは、プリコンパイルされたヘッダーを生成します, ない オブジェクトファイル。というファイルがありましたが、 foo.o
有効なオブジェクトファイルではありませんでした。あなたが走ったばかりであれば gcc -c fact.h
プリコンパイルされたヘッダーを生成していたでしょう fact.gch
, しかし、おそらくあなたは走った gcc -c fact.h -o fact.o
これにより、ファイルが呼び出されます fact.o
それはまだプリコンパイルされたヘッダーですが。 file 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.
ライブラリが現在のディレクトリにある場合は、絶対パスを指定するよりも簡単です。
他のヒント
私はわからない ar
最初のオプション以外のダッシュをサポートします。試してみてください
ar -rs libfact.a fact.o
またはちょうど
ar rs libfact.a fact.o
あなたを気に、私はなぜ実行しているのかわからない ranlib
しかし、動作しませんでした。