0

Linux の 64 ビット CentOS バージョンを使用しています。C および C++ プログラムで静的ライブラリ (libUtility.a) を作成して使用しようとしています。ライブラリを C でコンパイルし、ar で libUtility.a ファイルを生成できます。次に、それを自分のプログラムにリンクしようとします。Cコンパイラを使用するとすべてが機能します

cc myprog.c -o myprog -I/usr/local/include -L/LocationOfMyLib -lUtility

ただし、g++ コンパイラを使用すると、エラーが発生します。

g++ myprog.c -o myprog -I/usr/local/include -L/LocationOfMyLib -lUtility
myprog.c: In function 'int main(int, char**)':
/tmp/cckIN1Yk.o: In function `main':
myprog.c:(.text+0x41): undefined reference to `Utility_HiWorld(char*)'
collect2: ld returned 1 exit status

C および C++ の経験はある程度ありますが、独自のライブラリを作成した経験はありません。このライブラリには、Utility_HiWorld() という名前のサブルーチンが 1 つだけあります。そして、myprog.c はその 1 つのサブルーチンのみを呼び出します。ここで何が間違っていますか?

NEW: わかりました。「extern "C"」は絶対に使用しませんでした。私はそれが何であるかさえ知りませんでした。それで解決しました。

4

1 に答える 1

4

外部関数が C で記述されていることを C++ コンパイラに伝えていないと思います。

C および C++ からライブラリを使用したいので、ライブラリ ヘッダー ファイルで次のようなことを行う必要があります。

#ifdef __cplusplus
extern "C" {
#endif

void Utility_HiWorld(char*);

#ifdef __cplusplus
}
#endif

__cplusplusはC++プログラムに対してのみ定義されているため、C++プログラムは、C関数extern "C" { ... }であることを伝えるために必要なものを認識しUtility_HiWorldます。

詳しくはこちらをご覧ください。

推測ですが、問題が別のものであると思われる場合は、コードを投稿してください。

于 2013-09-22T17:54:04.837 に答える