アプリケーションで使用するライブラリを構築しようとしています。以下のようにライブラリをビルドしました。アプリケーションをコンパイルすると、以下のエラーが発生します。
私は次のことをしました。
私が使う:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
アプリケーションから呼び出されるライブラリ:
ここにはたくさんのモジュールがありますが、このライブラリへのエントリ ポイントは func() です (つまり、モジュールを呼び出すことができるように main () が func() に置き換えられます。また、func () は「静的」として宣言されていません)。
いずれかのファイルで:
int func ();
...
int func ()
{ ... }
次に、ライブラリを次のように構築しました。
gcc -Wall file.c -o file.o
...
...
ar rvs libfun.a $(OBJS)
また、libfun.a で ranlib と nm -s を個別に使用してシンボル テーブルを作成しましたが、これらのコマンドを使用した後もアーカイブの合計サイズは変わらず、リンク エラーが発生しました。$(OBJS) には、すべてのオブジェクト ファイルが含まれます。
アプリケーションで:
extern int 関数 ();
コンパイル:
gcc -Wall -L./path-to-lib -lfun -o appl
次に、以下のエラーが表示されます。
In function `main':
undefined reference to `func()'
collect2: ld returned 1 exit status
「ar s」と「ranlib」でシンボルテーブルを構築しようとしましたが、結果は同じです。
私が観察したことの1つは、私が構築した「ar」の内容と、他のモジュールのプロジェクトに既に存在するアーカイブに違いがあることです。
私が作成したアーカイブには次が含まれています(「nm -s libfun.a」で出力):
Archive index:
Cfg1 in f1.o
mCfg1 in f1.o
dpCfg in f1.o
しかし、私が変更せずに使用している他のアーカイブには、以下の奇妙なパターンが含まれています:
Archive index:
_Z29platformSetjP38tagTCPIP_INTERFACE_INSTANCE_ATTRIBUTES in platform.o
_Z27platformTestSetTcpjP20tagTCPIP_CONFIG_DATAPh in platform.o
_Z23platformSetTcpIpjP20tagTCPIP_CONFIG_DATA in platform.o
上記の違いが何であるかわかりません。それは共有ライブラリですか、それとも静的ライブラリですか?
GCC でコンパイルし、'ar' でアーカイブをビルドしようとしていますが、他のライブラリ ファイルは g++ コンパイラを使用している可能性があります。私はわかりません。念のため。
ここでライブラリを構築する際に何が間違っていますか? 助けてください?
よろしく。