3

gcc を使用して C++ アプリケーションにリンクしたい作業中の C ライブラリがありますが、リンカ (g++) で「複数定義」エラーが発生します。C アプリケーションと gcc で動作します。インターフェイスを定義するすべてのヘッダーには、次のものが含まれます。

#ifdef __cplusplus 
extern "C" {
#endif

「nm」コマンドを使用してライブラリを確認したところ、メソッドの定義が複数あります (問題のメソッドはパブリック インターフェイスからのものではありません)。

私の質問は次のとおりです。

  1. ライブラリに複数の定義があるのはなぜですか (T を持つものと U を持つものがあります)。

  2. ファイルを含むアプリケーションが C アプリケーション (ビルドに -Wall を使用している) の場合、なぜ機能するのですか?

  3. 特別な属性が必要ですか、特定のファイル拡張子を使用して機能させる必要がありますか、それともプログラミング学校に戻る必要があるのですか :) ?

lib.a ファイルに注目すると、オブジェクトの 1 つが 2 回含まれていることがわかります。たとえば、同じオブジェクトに対して 2 つのセクションがあります。

 obj1.o
 00000000     T    Method

 obj2.o
 00000000     T    Hello

 obj1.o
 00000000     T    Method

これが問題だと思いますか?

どんな助けでも本当に感謝しています。

4

2 に答える 2

1

いろいろ試してみたところ、C ライブラリを含める前に、実際にはコマンド ライン全体 (自動化されたコンパイルとリンケージを備えた一種の複雑なアプリケーション) に --whole-archive パラメーターが含まれていることがわかりました。--no-whole-archive の後にライブラリを移動すると、問題が修正されました。

オリジナルコマンド

   gcc -Wl,**--whole-archive** -l:otherlibs *-Llibpath -l:libname* Wl,**--no-whole-archive** -o myApp hello.c

固定コマンド

   gcc -Wl,**--whole-archive** -l:otherlibs Wl,**--no-whole-archive** *-Llibpath -l:libname* -o myApp hello.c

みんなの助けに感謝します。十分な/正確な情報を提供しなかった場合は申し訳ありません.

よろしくお願いします

于 2011-05-18T21:13:07.337 に答える
1

私の勝手な推測では、「#define BLAHBLAH_H」と「#ifndef BLAHBLAH_H / #endif」は「extern "C"{}」の外側に設定されています。

于 2011-05-18T00:23:34.013 に答える