用于导入的Dynlib编译指示

使用 dynlib 编译指示,可以从动态库(Windows的 .dll 文件,UNIX的 lib*.so 文件)导入过程或变量。

  1. proc gtk_image_new(): PGtkWidget
  2. {.cdecl, dynlib: "libgtk-x11-2.0.so", importc.}

通常,导入动态库不需要任何特殊的链接器选项或链接到导入库。 这也意味着不需要安装 开发 包。

dynlib 导入机制支持版本控制方案:

  1. proc Tcl_Eval(interp: pTcl_Interp, script: cstring): int {.cdecl,
  2. importc, dynlib: "libtcl(|8.5|8.4|8.3).so.(1|0)".}

在运行时,搜索动态库(按此顺序)

libtcl.so.1 libtcl.so.0 libtcl8.5.so.1 libtcl8.5.so.0 libtcl8.4.so.1 libtcl8.4.so.0 libtcl8.3.so.1 libtcl8.3.so.0

dynlib 编译指示不仅支持常量字符串作为参数,还支持字符串表达式:

  1. import os
  2.  
  3. proc getDllName: string =
  4. result = "mylib.dll"
  5. if existsFile(result): return
  6. result = "mylib2.dll"
  7. if existsFile(result): return
  8. quit("could not load dynamic library")
  9.  
  10. proc myImport(s: cstring) {.cdecl, importc, dynlib: getDllName().}

注意: 形如 libtcl(|8.5|8.4).so 只支持常量字符串,因为它们需要预编译。

注意: 传变量给 dynlib 编译指示在进行时会失败,因为初始化问题的顺序。

注意: dynlib 导入可以用 —dynlibOverride:name 命令行选项重写。 编译器用户指南包括更多信息。