在 Nim dll 中加载函数
Load function in Nim dll
我有两个文件:
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)
我通过运行宁nim c --app:lib foo.nim
编译foo.nim
,生成foo.dll
。当我 运行 bar.nim
时,我希望它从 foo.dll
加载 double
并打印 4
,但我收到此错误:
could not import: double
dllexp.exe 只显示 NimMainInner
,所以函数甚至没有导出。
如何从 dll 中导入 double
函数?我计划从多个 dll 加载可能具有相同名称的函数,因此首选可以处理该问题的解决方案。我在 运行 上 Windows 7.
double 是 C 中的保留字。而 nim 将 "double" 函数编译成这样:
extern "C" __declspec(dllexport) int double(int x0);
不知何故 vcc 可以编译这样的代码,但是 gcc 不能。
但是有一个解决方案可以在 link 阶段
期间重命名 "double" 符号
proc double*(x: cint): cint
{.cdecl, exportc: "_double", dynlib.} =
return x * 2
{.emit: """
#pragma comment(linker, "/export:double=_double")
""".}
生成的 dll 将具有原始的“_double”和 "double" 个符号
我有两个文件:
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)
我通过运行宁nim c --app:lib foo.nim
编译foo.nim
,生成foo.dll
。当我 运行 bar.nim
时,我希望它从 foo.dll
加载 double
并打印 4
,但我收到此错误:
could not import: double
dllexp.exe 只显示 NimMainInner
,所以函数甚至没有导出。
如何从 dll 中导入 double
函数?我计划从多个 dll 加载可能具有相同名称的函数,因此首选可以处理该问题的解决方案。我在 运行 上 Windows 7.
double 是 C 中的保留字。而 nim 将 "double" 函数编译成这样:
extern "C" __declspec(dllexport) int double(int x0);
不知何故 vcc 可以编译这样的代码,但是 gcc 不能。 但是有一个解决方案可以在 link 阶段
期间重命名 "double" 符号proc double*(x: cint): cint
{.cdecl, exportc: "_double", dynlib.} =
return x * 2
{.emit: """
#pragma comment(linker, "/export:double=_double")
""".}
生成的 dll 将具有原始的“_double”和 "double" 个符号