cwnicol programming

プログラミング関連の投稿をすこしだけ

C++ソースから、Cで作成したライブラリをリンクする方法

■概要
   何も考えずに下図のような構成にすると、                                   
   C++ソース(下図ではA.o)から、Cで作成したライブラリ(下図ではC.o)を
    リンクできない。
    f:id:katetyan:20160503092923p:plain
                               
■原因    
    f:id:katetyan:20160503091122p:plain     

    関数呼び出し1で、探している名前("関数Z@sjadfpioa"(*1))と
    実際の名前("関数Z")が異なるので、関数Zを探し出すことができない。
    (関数呼び出し2では問題なく関数Zを見つけられる。)
   (*1)マングリングされた名前。「sjadfpioa」は適当に付けた
                                                             
■解決策                                                         
    名前の不一致が原因なので、関数呼び出し1でもC.oの関数Zを
    "関数Z"という名前で探せばよい。
    f:id:katetyan:20160503091124p:plain

   下記解決策が考えられる。


    <解決策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