用于导入的Dynlib编译指示
使用 dynlib 编译指示,可以从动态库(Windows的 .dll 文件,UNIX的 lib*.so 文件)导入过程或变量。
- proc gtk_image_new(): PGtkWidget
- {.cdecl, dynlib: "libgtk-x11-2.0.so", importc.}
通常,导入动态库不需要任何特殊的链接器选项或链接到导入库。 这也意味着不需要安装 开发 包。
dynlib 导入机制支持版本控制方案:
- proc Tcl_Eval(interp: pTcl_Interp, script: cstring): int {.cdecl,
- 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 编译指示不仅支持常量字符串作为参数,还支持字符串表达式:
- import os
- proc getDllName: string =
- result = "mylib.dll"
- if existsFile(result): return
- result = "mylib2.dll"
- if existsFile(result): return
- quit("could not load dynamic library")
- proc myImport(s: cstring) {.cdecl, importc, dynlib: getDllName().}
注意: 形如 libtcl(|8.5|8.4).so 只支持常量字符串,因为它们需要预编译。
注意: 传变量给 dynlib 编译指示在进行时会失败,因为初始化问题的顺序。
注意: dynlib 导入可以用 —dynlibOverride:name 命令行选项重写。 编译器用户指南包括更多信息。