我想编译一个OCaml程序,与C代码进行接口,并使用基于MinGW的GCC,采用分离编译(GCC生成
对我来说不清楚的是:(1)这是否适用于Windows;如果适用,(2)需要哪些命令行参数。
我使用Jonathan Protzenko的Windows上的OCaml安装程序安装了OCaml 4.02.1以及一个Cygwin shell(注意它使用本地Windows OCaml编译器,而不是基于Cygwin的编译器)。我使用Nuwen的MinGW安装了gcc(但在使用Strawberry Perl的gcc时也遇到了同样的问题)。
这是我的源代码:
C文件(
以下内容完全正常:
.o
文件,然后ocamlopt
生成最终可执行文件)。对我来说不清楚的是:(1)这是否适用于Windows;如果适用,(2)需要哪些命令行参数。
我使用Jonathan Protzenko的Windows上的OCaml安装程序安装了OCaml 4.02.1以及一个Cygwin shell(注意它使用本地Windows OCaml编译器,而不是基于Cygwin的编译器)。我使用Nuwen的MinGW安装了gcc(但在使用Strawberry Perl的gcc时也遇到了同样的问题)。
这是我的源代码:
C文件(
tc.c
):#include <stdio.h>
#include "caml/mlvalues.h"
value print(value unused) {
printf("hello from C\n");
return Val_unit;
}
OCaml文件(t.ml
):
external print : unit -> unit = "print"
let () =
Printf.printf "platform: %s\n" (Sys.os_type);
print ();
以下内容完全正常:
and@win7 $ ocamlopt t.ml tc.c -o t.exe
and@win7 $ ./t.exe
platform: Win32
hello from C
然而,如果我使用 .o
而不是 .c
,它就无法工作:
and@win7 $ gcc tc.c -c -I c:/OCaml/lib -o tc.o
and@win7 $ ocamlopt t.ml tc.o -o t.exe
** Cannot resolve symbols for tc.o:
puts
** Fatal error: Unsupported relocation kind 0004 for puts in tc.o
File "caml_startup", line 1:
Error: Error during linking
两个版本在Linux上都可以正常运行。
我想知道,是不是只需要给gcc / ocamlc / ocamlopt正确的参数,就能快速解决一些愚蠢的错误,还是OCaml在Windows上本地编译的一个当前限制。
编辑: camlspotter找出了原因,所以事后看来,我根本不需要Nuwen的MinGW。在Windows上,OCaml已经包含基于MinGW的C编译器,只不过它称为i686-w64-mingw32-gcc
而不是gcc
。
mingw
标签;mingw-w64
可能是可接受的替代品(但 nuwen 并不严格属于那个分支)。 - Keith Marshall