C++ソースから、Cで作成したライブラリをリンクする方法
■概要
何も考えずに下図のような構成にすると、
C++ソース(下図ではA.o)から、Cで作成したライブラリ(下図ではC.o)を
リンクできない。
■原因
関数呼び出し1で、探している名前("関数Z@sjadfpioa"(*1))と
実際の名前("関数Z")が異なるので、関数Zを探し出すことができない。
(関数呼び出し2では問題なく関数Zを見つけられる。)
(*1)マングリングされた名前。「sjadfpioa」は適当に付けた
■解決策
名前の不一致が原因なので、関数呼び出し1でもC.oの関数Zを
"関数Z"という名前で探せばよい。
下記解決策が考えられる。
<解決策1>
C.oに対応するヘッダーファイル(C.o内で定義されている関数の
宣言が入っているもの)で
#ifdef __cplusplus extern "C" { #endif int 関数Z(); #ifdef __cplusplus } #endif
のようにする。
このようなヘッダーファイルを読み込んだA.oのC++コンパイラは、
関数Zを"関数Z"で探すようになる。
また、このようなヘッダーファイルはCコンパイラからも、
問題なく使用できる。
(「__cplusplus」はコンパイラによって異なるので注意)
<解決策2>
C.oに対応するヘッダーファイル(C.o内で定義されて
いる関数の宣言が入っているもの)を編集できない/したくない
場合は、A.oをコンパイルする際に、
extern "C"{ #include "C.oに対応するヘッダーファイル" }
とする。
関数個別にextern "C"できないなら、当該関数宣言を含むヘッダー
ファイル丸ごとextern "C"してしまえ、という発想だ。
■参考URL
http://www.geocities.jp/ky_webid/cpp/language/038.html
http://1024x768.blog74.fc2.com/blog-entry-31.html