2011-11-15 14 views
0

私は現在、Cインタフェースを備えたサードパーティのライブラリ(ヘッダファイルはC言語で書かれています)に応じてCプログラムを開発しています。私はすべての必要な.soファイルをリンクしてプログラムをコンパイルします。すべてうまくいきます。しかし、私は最近、このサードパーティのライブラリのソースコードを見ています。明らかに、C++で書かれており、C++の機能(名前空間、OOPなど)を利用しています。CプログラムのC++共有オブジェクトを使用しますか?

これも可能ですか?だから、私はC++でライブラリを書くことができ、Cインタフェースを提供し、.soファイルを生成してC++の実装を隠してから、私のライブラリをCプログラムの中で使うことができます。それは問題を引き起こすでしょうか?

ありがとうございます!

+0

このサイトの右上にある検索バーに "C++ library C interface"と入力してみてください。 –

+0

ああ、どういうわけか私は以前にその投稿を見つけられませんでした。誰でもこれを重複としてマークすることができます:http://stackoverflow.com/questions/4978330/c-library-with-c-interface – Andree

答えて

4

はい。
ライブラリはC++で書かれていますが、CプログラムにリンクするためにCリンケージを使用するインタフェースを提供します。
C++標準で具体的には、リンケージ仕様をC++プログラムに指定するための規定が用意されているため、これは基本的に可能です。例については

extern "C" 
{  
    void doSomething(char);  
} 

extern "C"ここでは、それがCで機能doSomething()を作るリンケージ指定は、これはあなたのことを保証します(コンパイラがC++スタイル Name Manglingを行いません) 'C' リンケージを持つ++ですCコードをリンクすることができます。
C++関数定義はすでにコンパイルされ、バイナリ形式に変換されているので、クライアントアプリケーション/ライブラリ 'C'リンカは 'C'名を使用してこのコードにリンクします。

CおよびC++用のネーム・マングリングの違いの例:++
CはCがそうではないのオーバーロード機能をサポートしていますので、C++コンパイラは、関数の引数の引数に関する情報を追加して名前をマングルする必要があります。関数オーバーロードのサポートがないため、C言語コンパイラは関数引数を使用して名前を変更する必要はありません.extern "C"リンケージのLinkage指定を使用すると、C++コンパイラは関数の引数情報をリンケージに使用する名前に追加しません。

+0

コンパイラは名前のマングリングを行いますが、Cルールを使用します(多くの場合、アンダースコアの前に接頭辞を付けます)。 –

+0

@BenVoigt:良い点。明確にするためにいくつかの説明を追加しました。 –

関連する問題