Nim dll中的加载功能

时间:2016-06-21 17:18:08

标签: windows dll dllimport nim

我有两个文件:

foo.nim

 proc double*(x: cint): cint
    {.cdecl, exportc: "double", dynlib.} =
    return x * 2

bar.nim

proc double(x: cint): cint
  {.cdecl, dynlib: "foo.dll", importc.}

echo double(2)

我通过运行生成foo.nim的{​​{1}}来编译nim c --app:lib foo.nim。当我运行foo.dll时,我希望它从bar.nim加载double并打印foo.dll,但我收到此错误:

4

dllexp.exe只显示could not import: double ,因此甚至不会导出该功能。

如何从dll导入NimMainInner函数?我计划从多个dll加载可能具有相同名称的函数,因此可以使用可以处理该函数的解决方案。我在Windows 7上运行它。

1 个答案:

答案 0 :(得分:1)

double 是C中的保留字。 nim 将“double”函数编译为这样的内容:

extern "C" __declspec(dllexport) int double(int x0);

以某种方式 vcc 可以编译此类代码,但 gcc 则不能。 但是有一种解决方法可以在链接阶段重命名“双”符号

proc double*(x: cint): cint
    {.cdecl, exportc: "_double", dynlib.} =
    return x * 2

{.emit: """
#pragma comment(linker, "/export:double=_double")
""".}

生成的dll将具有原始的“_double”和“double”符号