[解決済み] C言語からC++の関数を呼び出すには?
2023-01-22 20:55:59
質問
これは知っています。
C++からCの関数を呼び出す。
もし私のアプリケーションがC++で、Cで書かれたライブラリから関数を呼び出す必要があったとしたら、私は次のように使うでしょう。
//main.cpp
extern "C" void C_library_function(int x, int y);//prototype
C_library_function(2,4);// directly using it.
これなら、名前を混乱させることなく
C_library_function
となり、リンカは入力の *.lib ファイルに同じ名前を見つけるので、問題は解決します。
C++の関数をCから呼び出す?
しかし、ここで私はCで書かれた大規模なアプリケーションを拡張しており、C++で書かれたライブラリを使用する必要があります。C++の名前のマングリングは、ここで問題を引き起こしています。リンカーは未解決のシンボルについて文句を言っています。C++コンパイラは、他の多くのものを破壊してしまうので、私のCプロジェクトに使用することはできません。どのような解決策があるのでしょうか?
ところで、私は MSVC を使用しています。
どのように解決するのですか?
C++ コードの機能を公開するための C API を作成する必要があります。基本的には、extern "C" と宣言された C++ コードで、C++ ライブラリをラップする純粋な C API (たとえば、クラスを使用しない) を記述する必要があります。そして、作成した純粋な C ラッパー ライブラリを使用します。
C API は、C がオブジェクト指向でないにもかかわらず、オプションでオブジェクト指向のスタイルに従うことができます。例
// *.h file
// ...
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
typedef void* mylibrary_mytype_t;
EXTERNC mylibrary_mytype_t mylibrary_mytype_init();
EXTERNC void mylibrary_mytype_destroy(mylibrary_mytype_t mytype);
EXTERNC void mylibrary_mytype_doit(mylibrary_mytype_t self, int param);
#undef EXTERNC
// ...
// *.cpp file
mylibrary_mytype_t mylibrary_mytype_init() {
return new MyType;
}
void mylibrary_mytype_destroy(mylibrary_mytype_t untyped_ptr) {
MyType* typed_ptr = static_cast<MyType*>(untyped_ptr);
delete typed_ptr;
}
void mylibrary_mytype_doit(mylibrary_mytype_t untyped_self, int param) {
MyType* typed_self = static_cast<MyType*>(untyped_self);
typed_self->doIt(param);
}
関連
-
[解決済み] テスト
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] 派生クラス関数から親クラス関数を呼び出すには?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない