我有两个文件:
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上运行它。
答案 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”符号