我几乎阅读了我可以通过谷歌找到的每个例子,并且无法完成最简单的任务创建nim
(windows) < strong>来自nim
有人可以一步一步解释吗?
我正在使用aporia
IDE - dll
来生成代码。
构建aporia IDE
是否需要使用命令行?我想有一个解决方法。
使用command line
\ dll
,如何通过将以下代码编译为extern "C" __declspec(dllexport) int __stdcall return_multiply(int num1, int num2)
{
return num1 * num2;
}
来获得相同的结果:
c#
您可能知道的代码可以从ffmpeg
答案 0 :(得分:6)
简而言之:
{.stdcall,exportc,dynlib.}
--app:lib
请记住,您始终可以检查生成的C代码以查看正在进行的操作。因此,让我们从包含以下内容的文件test.nim
开始:
proc return_multiply(num1, num2: int): int {.stdcall,exportc,dynlib.} =
num1 * num2
使用nim c --app:lib -d:release test.nim
进行编译会生成DLL以及此代码(在nimcache文件夹中):
N_LIB_EXPORT N_STDCALL(NI, return_multiply)(NI num1, NI num2) {
NI result;
result = 0;
result = (NI)(num1 * num2);
return result;
}
您可以在nimbase.h
中查找这些宏。例如,对于Windows,N_LIB_EXPORT
定义如下:
# ifdef __cplusplus
# define N_LIB_EXPORT extern "C" __declspec(dllexport)
# else
# define N_LIB_EXPORT extern __declspec(dllexport)
# endif
# define N_LIB_IMPORT extern __declspec(dllimport)
总的来说,你最终会得到你给出的功能签名。
如果您不想使用命令行进行编译,则必须确定哪些Aporia设置启用--app:lib
。
答案 1 :(得分:1)
顺便说一句,看看Nim论坛中的这个帖子,看看你的32位版本无法正常工作的可能原因。
http://forum.nim-lang.org/t/1721
简短版本是MSVC在32位平台上对stdcall函数进行命名,除非您采取措施覆盖它(例如创建.DEF文件来定义函数名称)。