私はCで書かれたプログラムを持っていて、C++で書かれたKDISライブラリを使用する必要があります。KDevelopのautomake&friendsを使用してCプログラムをコンパイルします。どうすればすべてを一緒にコンパイルできますか?Cプログラム内でいくつかのKDIS関数を呼び出したいからです。
前もって感謝します。
私はCで書かれたプログラムを持っていて、C++で書かれたKDISライブラリを使用する必要があります。KDevelopのautomake&friendsを使用してCプログラムをコンパイルします。どうすればすべてを一緒にコンパイルできますか?Cプログラム内でいくつかのKDIS関数を呼び出したいからです。
前もって感謝します。
デクラレートされていないC++関数を呼び出す必要がある場合はextern "C"
、C++プログラムから自分で呼び出す必要があります。プロジェクト内に単一のC++ファイルを作成して、プロジェクトextern "C"
の残りの部分で使用される関数に必要なすべてのライブラリ関数をラップすることができます。CとC++の両方を使用していることをautotoolsに通知する必要があります。ファイル拡張子は、どれがどれであるかを決定するのに十分でなければなりません。
例を挙げると、C++で記述されたmymagic.cc
いくつかのバインディングを作成する次のことを検討してください。libmagic
#include <libmagic/magic.hh>
extern "C" {
int doMagic() {
magic::Wizard w("foo", 42);
magic::Result res = w.doMagic();
return res.getResultCode();
}
}
アプリケーションの残りの部分には、doMagic()
単なる別のC関数として表示されます。ただし、内部はC ++であるため、任意のC++構造を使用できます。ライブラリからのものを渡す必要がある場合は、不透明(OPAQUE)型へのポインタを使用する必要があります。したがって、Cコードでも使用されるヘッダーmymagic.h
には、次のように記述できます。
struct magicValue;
int doMagic(void);
struct magicValue* createMagic(void);
void destroyMagic(struct magicValue*);
そして、mymagic.cc
あなたはより明確になります:
struct magicValue {
magic::value v;
magicValue(magic::value val) : v(val) { }
};
magicValue* createMagic() {
return new magicValue(magic::value("foo"));
}
void destroyMagic(magicValue*) {
delete magicValue;
}