• 用于导入的Dynlib编译指示

    用于导入的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 命令行选项重写。 编译器用户指南包括更多信息。