经过几周的努力,我已成功编写了使用LLVM进行JIT编译的F#程序。然而,每当我在附加了调试器的Visual Studio 2010中运行我的程序(即按下F5键),都会收到以下警告:
其他人遇到这个问题似乎通过向PInvoke调用添加请求ANSI字符串或CDecl调用约定的属性来解决了它。我发现改变调用约定可以修复Windows Vista桌面上的警告,但是所有可用的调用约定(或ANSI格式字符串)都无法修复Windows 7 netbook上的警告。有什么想法如何解决这个问题?
请注意,两台计算机都是完全的32位x86。
编辑
人们发布评论要求重现。最简单的方法是按照我记录的说明here安装LLVM和llvm-fs,并运行任何给定的示例程序。它们在我的netbook上对LLVM的所有调用都表现出这个问题。
或者,以下代码(源自llvm-fs)应该能够重现问题,而不需要llvm-fs:
open System.Runtime.InteropServices
[<DllImport("LLVM-3.0.dll",
EntryPoint="LLVMModuleCreateWithName",
CharSet=CharSet.Ansi,
CallingConvention=CallingConvention.Cdecl)>]
extern void *moduleCreateWithNameNative(string ModuleID)
let mdl = moduleCreateWithNameNative "foo"
请注意,原始的C头文件中对应的定义如下:
typedef struct LLVMOpaqueModule *LLVMModuleRef;
...
LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
cdecl
时,你指的是在pinvoke中。我会期望C++库使用cdecl
,所以这很合理。现在,pinvoke的返回类型看起来有点奇怪。我认为它应该是IntPtr
。因此声明应该是extern IntPtr moduleCreateWithNameNative(string ModuleID)
。 - David Heffernan