スポンサーリンク

Rustで.libや.dllを作り、C++から呼び出す

Rust側

プロジェクト設定

まず、cargoで--libを指定してプロジェクトを作成する

>cargo new myhello --lib
Created library `myhello` package

Cargo.tomlに以下の設定を追加:

[lib]
name = "myhello"
crate-type = ["cdylib"]

なお、これがdllではなくstatic libraryのみの場合は、以下のように設定する。

[lib]
name = "myhello"
crate-type = ["staticlib"]

 

プログラム

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 になってしまう。今のところ修正する方法がないらしいので、気になるなら手動で修正する。

> cargo build --release

 

C++側

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;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: