经过数周的努力,我设法编写了使用 LLVM 进行 JIT 编译的 F# 程序。但是,每当我在带有调试器的 Visual Studio 2010 中运行我的程序时(即按 F5),我都会收到以下警告:
现在,在使用我的 Windows 7 上网本时,每次 PInvoke 调用都会收到此警告,但在使用 Windows Vista 桌面时,我只会在某些调用中收到此警告。
其他遇到这个问题的人似乎已经通过向请求 ANSI 字符串或CDecl
调用约定的 PInvoke 调用添加属性来解决它。我发现更改调用约定修复了我的 Windows Vista 桌面上的警告,但没有可用的调用约定(或 ANSI 格式字符串)修复我的 Windows 7 上网本上的警告。任何想法如何解决这一问题?
请注意,两台机器都是 32 位 x86。
编辑
人们正在发表评论,要求重新进行。重现此问题的最简单方法是按照我在此处记录的说明安装 LLVM 和 llvm-fs并运行给出的任何示例程序。他们都在我上网本上对 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);