スポンサーリンク
まず、cargoで--libを指定してプロジェクトを作成する
Cargo.tomlに以下の設定を追加:
なお、これがdllではなくstatic libraryのみの場合は、以下のように設定する。
Rust側では以下のような関数を用意する。
#[no_mangle] は、関数のオーバーロードなどのためにコンパイラが勝手に関数名を変更するのを防ぐために指定。
extern "C" は、関数の呼び出し規約をC言語にするための設定。ほかにも"stdcall"など色々用意されている。
#[no_mangle] pub extern "C" fn add(a: i32, b: i32) -> i32 { a + b }
cargo build --releaseでビルドする。
この時、myhello.dllができるのだが、libのほうがmyhello.dll.lib になってしまう。今のところ修正する方法がないらしいので、気になるなら手動で修正する。
C++から呼び出し。extern "C"でC++のマングル回避。
// 関数宣言。この関数はRust側にある。 // 本当は.hppファイルなどに定義するべきだが // 今はここに書いておく。 extern "C" { int add(int a, int b); } #pragma comment(lib,"myhello.dll.lib") #include <iostream> int main() { // 関数呼び出し std::cout << add(3,5) << std::endl; }