Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

libcallの使い方まとめ

$
0
0

libcall (or libcallnr) は、ダイナミックリンクライブラリの関数を呼び出すことができる。
ここでは以下について述べる。

  1. vim scriptからlibcallで外部ライブラリを呼び出す方法
  2. libcallで呼ぶことのできる外部ライブラリの作成方法

vim scriptからlibcallで外部ライブラリを呼び出す

libcallから呼び出すことのできる外部ライブラリ内の関数シグニチャは、

  • {char*,int} cdecl hoge({char*,int})

でなければならない。
libcallを実際に使う際には、

" char* cdecl some_func(char*)を呼び出す場合" *nix系の場合 => 拡張子まで含めたファイルパスを指定
echo libcall('path/to/shared-object.so','some_func','string to be passed')" windowsの場合 => 拡張子を含めないファイルパスを指定
echo libcall('path/to/dynamic-link-library','some_func','string to be passed')

とする。
libcallの第一引数には外部ライブラリのファイルパスを指定、第二引数には呼び出す関数名を指定する。
第三引数には、文字列か整数を渡す必要がある。

libcallとlibcallnrの使い分けとしては、呼び出す関数の返り値がchar*かintかで分ける。

libcallで呼ぶことのできる外部ライブラリの作成方法

関数宣言時の注意点は以下。

  1. 呼び出し規約はcdeclを使用する
  2. 引数は厳密に1つのみ、以下の型で受け取る
    • char*
    • int
  3. 返り値は以下の型のみ使用できる
    • char*
    • int

返り値としてchar*を使用する場合、vim側でfreeは行われないため、外部ライブラリ側でfreeする必要がある。
また通常のダイナミックリンクライブラリと同様、外部ライブラリ内でデータを保持することができる。

shared objectの場合は、コンパイルオプションに-fPICを指定する必要がある。
dynamic link libraryの場合は、__declspec(dllexport)する必要がある。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>