7

アプリケーションで使用するライブラリを構築しようとしています。以下のようにライブラリをビルドしました。アプリケーションをコンパイルすると、以下のエラーが発生します。

私は次のことをしました。

私が使う:

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++ コンパイラを使用している可能性があります。私はわかりません。念のため。

ここでライブラリを構築する際に何が間違っていますか? 助けてください?

よろしく。

4

2 に答える 2

1

エラーの原因がわかりました。スタティック ライブラリと、位置独立コード (PIC) およびその他のフラグでコンパイルされた他のライブラリを混在させていました。これらのフラグを追加すると、問題が解決しました。

于 2012-12-18T06:33:20.843 に答える