Golangにつづき、重要言語であるRustについてもCとのインターフェイスを調べてみました。
「Call C code from Golang」
環境)
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
rustc 1.69.0 (84c898d65 2023-04-16)
hello.c
1 2 3 4 5 |
#include<stdio.h> void hello(){ printf("hello!\n"); } |
callc.rs
1 2 3 4 5 6 7 8 |
#[link(name="hello", kind="static")] extern{ fn hello(); } fn main() { unsafe {hello();}; } |
$ gcc -o hello.o -c hello.c
$ ar rcs libhello.a hello.o
$ rustc -L. callc.rs
$ ./callc
hello!
hello.rs
1 2 3 4 5 6 |
#![crate_type = "cdylib"] #[no_mangle] pub extern "C" fn hello(){ println!("hello!"); } |
callrs.c
1 2 3 4 5 6 7 8 |
#include <stdio.h> void hello(void); int main(int argc, char **argv){ hello(); return 0; } |
$ rustc hello.rs
$ gcc -o callrs.o -c callrs.c
$ gcc -o callrs callrs.o -L. -lhello
$ ldd callrs
linux-vdso.so.1 (0x00007ffcecfcb000)
libhello.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f96a0efc000)
/lib64/ld-linux-x86-64.so.2 (0x00007f96a110a000)
$ LD_LIBRARY_PATH=. ./callrs
hello!
引数についてもテストしたかったのですが、ここまででもバージョンによるオプション違いとか、いろいろと迷うところがあったため、まずは自環境での動作を確認する意味でここまでとしました。
rustよびだしは、shared objectなります。(libhello.so) また最小限のやり方を試す意味で rustcを直接使用しました。
参考)https://mmi.hatenablog.com/entry/2017/02/28/213656