代码之家  ›  专栏  ›  技术社区  ›  LB40

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

  •  3
  • LB40  · 技术社区  · 15 年前

    我正在尝试安装o caml-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,你经历过这个吗? 我正在运行从源代码编译的OCAMLv3.11.1。

    编辑: 文件似乎是由ocamlfind提供的,可能是因为我使用的是64环境?

    2 回复  |  直到 15 年前
        1
  •  2
  •   LB40    15 年前

    因此,问题似乎来自不同的方向:

    首先,ocamlfind使用的ocaml编译器不正确。通过查看/usr/local/etc/findlib.conf,我发现ocamlc指向ocamlot.opt,这是3.10版。

    然后,我必须重新编译findlib。但是有一个问题,因为我使用的是64个体系结构,并且没有找到一些元素,所以我主要需要重新配置findlib修改-bindir和-sitelib。

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

    现在,它工作了,但我必须使用-i添加sqlite3.cma的目录(/usr/lib64/ocaml/site lib/sqlite3)。

    但不确定这对任何人都有帮助:—)。

        2
  •  2
  •   ygrek    15 年前

    通常,当OCAML编译器尝试使用由另一个版本的OCAML创建的二进制文件(CMA、CMO等)时,会出现此错误。特别是,它意味着需要重新编译 全部的 升级ocaml时的库(即使是像3.11.0->3.11.1这样的次要版本转换)。

    可能是ocamfind调用了不同的ocaml安装 make make install 阶段?

    推荐文章