Nim编译和使用DLL

原创
2015/11/23 21:13
阅读数 1.2K
# plugin.nim

var data = 0

{.push dynlib exportc.}

proc setup*(num:int) =
  data = num
  echo "Plugin Setup!"

proc getData*: int = data

{.pop.}
# app.nim

import dynlib

type
  SetupProc = proc(num:int) {.nimcall.}
  GetDataProc = proc(): int {.nimcall.}

proc testPlugin(path:string) =
  let lib = loadLib(path)
  if lib != nil:
    let setupAddr = lib.symAddr("setup")
    let getDataAddr = lib.symAddr("getData")
    
    if setupAddr != nil and getDataAddr != nil:
      let setup = cast[SetupProc](setupAddr)
      let getData = cast[GetDataProc](getDataAddr)
      
      setup(123)
      echo "Plugin Data: ", getData()
    
    unloadLib(lib)

testPlugin("./libplugin.so") # unix path
testPlugin("./libplugin.dylib")
$ nim c --app:lib plugin
$ nim c -r app

Plugin Setup!
Plugin Data: 123

nimcall其实就是fastcall.

如果想使用nim来写dll可以参考:nim-invocation-example-from-c

代码转自 Nim官方论坛

展开阅读全文
打赏
1
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
1
分享
返回顶部
顶部