“cma文件不是字节码对象文件”=>那是什么意思?

时间:2009-09-21 23:17:19

标签: sqlite ocaml

我正在尝试安装ocaml-sqlite3绑定,以便从o'caml程序访问sqlite数据库。

配置并顺利进行,但安装失败。因为文件sqlite3.cma不是字节码对象文件(见下文)。

    ~/Software/ocaml-sqlite3-release-1.5.6> sudo make install

[ -f *.so ] && SO_FILES=*.so; \
        ocamlfind install sqlite3 META sqlite3.cmi sqlite3.mli sqlite3.cma *.cmxa *.a *.cmx $SO_FILES
Installed /usr/lib64/ocaml/site-lib/sqlite3/dllsqlite3_stubs.so
Installed /usr/lib64/ocaml/site-lib/sqlite3/sqlite3.cmx
Installed /usr/lib64/ocaml/site-lib/sqlite3/sqlite3.a
Installed /usr/lib64/ocaml/site-lib/sqlite3/libsqlite3_stubs.a
Installed /usr/lib64/ocaml/site-lib/sqlite3/sqlite3.cmxa
Installed /usr/lib64/ocaml/site-lib/sqlite3/sqlite3.cma
Installed /usr/lib64/ocaml/site-lib/sqlite3/sqlite3.mli
Installed /usr/lib64/ocaml/site-lib/sqlite3/sqlite3.cmi
Installed /usr/lib64/ocaml/site-lib/sqlite3/META
Updated /usr/lib64/ocaml/ld.conf
ocamlfind ocamlmktop -o sqlite3top -package "sqlite3" sqlite3.cma
The file sqlite3.cma is not a bytecode object file
make: *** [install] Error 2

这一般的原因是什么,你有没有经历过这个特定的lib? 我正在运行从源代码编译的ocaml v 3.11.1。

修改 看来这个文件是由ocamlfind提供的,也许问题是由于我使用的是64环境?

2 个答案:

答案 0 :(得分:2)

所以似乎问题来自不同的方向:

首先,ocamlfind使用的ocaml编译器不正确。我通过查看/usr/local/etc/findlib.conf来解决这个问题。 ocamlc指向ocamlopt.opt,那是版本3.10。

然后,我不得不重新编译findlib。但是有一个问题,因为我在64架构上并且找不到一些元素,所以我不得不重新配置findlib修改-bindir和-sitelib。

我还用-cc“gcc -m64”重新编译了ocaml系统,但我不确定它是否有任何影响。

现在,它可以工作,但我要使用-I添加sqlite3.cma目录(/ usr / lib64 / ocaml / site-lib / sqlite3)。

不确定这可以帮助任何人: - )。

答案 1 :(得分:2)

当ocaml编译器尝试使用由另一个版本的ocaml创建的二进制文件(cma,cmo等)时,通常会出现此错误。特别是,这意味着在升级ocaml时需要重新编译所有库(即使是3.11.0 - > 3.11.1之类的小版本转换)。

可能是ocamlfind在makemake install阶段调用了不同的ocaml安装吗?