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

使用它编译c lib和ocaml exe,全部使用ocamlfind

  •  4
  • Magnus  · 技术社区  · 15 年前

    我在想怎么用 ocamlfind 使用C库编译C库和OCAML可执行文件。

    我整理了一组相当愚蠢的示例文件。

    % cat sillystubs.c
    #include <stdio.h>
    
    #include <caml/mlvalues.h>
    #include <caml/memory.h>
    #include <caml/alloc.h>
    #include <caml/custom.h>
    
    value
    caml_silly_silly( value unit )
    {
        CAMLparam1( unit );
        printf( "%s\n", __FILE__ );
        CAMLreturn( Val_unit );
    }
    
    % cat silly.mli 
    external silly : unit -> unit = "silly_silly"
    
    % cat foo.ml
    open Silly
    open String
    
    let _ =
        print_string "About to call into silly";
        silly ();
        print_string "Called into silly"
    

    我相信以下是编译图书馆的方法:

    % ocamlfind ocamlc -c sillystubs.c
    % ar rc libsillystubs.a sillystubs.o
    % ocamlfind ocamlc -c silly.mli
    % ocamlfind ocamlc -a -o silly.cma -ccopt -L${PWD} -cclib -lsillystubs
    

    但现在我似乎无法使用创建的库:

    % ocamlfind ocamlc -custom -o foo foo.cmo silly.cma
    /usr/bin/ld: cannot find -lsillystubs
    collect2: ld returned 1 exit status
    File "_none_", line 1, characters 0-1:
    Error: Error while building custom runtime system
    

    OCAML工具对我来说有些神秘,所以任何指针都是最受欢迎的。

    3 回复  |  直到 15 年前
        1
  •  7
  •   ygrek    15 年前

    奥卡姆姆姆利布去营救。一步一步地:

    $ ocamlc -verbose -c sillystubs.c
    $ ocamlmklib -verbose sillystubs.o silly.mli -o silly
    $ ocamlc -verbose silly.cma foo.ml -o foo
    File "foo.ml", line 1, characters 0-1:
    Error: Error while linking foo.cmo:
    The external function `silly_silly' is not available
    

    哦,你在sillystubs.c中定义了caml_tilly_tilly,但在tilly.mli中引用了tilly_tilly(太愚蠢了:)修复:

    $ cat silly.mli 
    external silly : unit -> unit = "caml_silly_silly"
    $ ocamlmklib -verbose sillystubs.o silly.mli -o silly
    $ ocamlc -custom -verbose silly.cma foo.ml -o foo
    /usr/bin/ld: cannot find -lsilly
    collect2: ld returned 1 exit status
    File "foo.ml", line 1, characters 0-1:
    Error: Error while building custom runtime system
    

    还是没有运气?添加 -I. 找到所需的库。

    $ ocamlc -I . -verbose silly.cma foo.ml -o foo.byte
    $ ocamlc -I . -verbose -custom silly.cma foo.ml -o foo.byte.custom
    $ ocamlopt -I . -verbose silly.cmxa foo.ml -o foo.native
    

    但在“真正的”安装中,您确实希望使用ocamlfind安装愚蠢的库,然后通过ocamlfind运行编译,将放置所需的命令行选项,所有操作都会自动进行。从零开始,整个过程如下:

    $ ocamlc -verbose -c sillystubs.c
    $ ocamlmklib -verbose sillystubs.o silly.mli -o silly
    $ cat META
    version="0"
    description="quite silly"
    archive(byte)="silly.cma"
    archive(native)="silly.cmxa"
    $ ocamlfind install silly META silly.cm* *.mli *.a *.so
    Installed /usr/local/lib/ocaml/3.11.2/silly/silly.a
    Installed /usr/local/lib/ocaml/3.11.2/silly/libsilly.a
    Installed /usr/local/lib/ocaml/3.11.2/silly/silly.mli
    Installed /usr/local/lib/ocaml/3.11.2/silly/silly.cmxa
    Installed /usr/local/lib/ocaml/3.11.2/silly/silly.cmi
    Installed /usr/local/lib/ocaml/3.11.2/silly/silly.cma
    Installed /usr/local/lib/ocaml/3.11.2/silly/META
    Installed /usr/local/lib/ocaml/3.11.2/stublibs/dllsilly.so
    Installed /usr/local/lib/ocaml/3.11.2/stublibs/dllsilly.so.owner
    $ rm *.cm* *.a *.so *.o
    $ ocamlfind ocamlopt -linkpkg -package silly foo.ml -o foo.native
    $ ocamlfind ocamlc -custom -linkpkg -package silly foo.ml -o foo.byte.custom
    $ ocamlfind ocamlc -linkpkg -package silly foo.ml -o foo.byte
    

    本机版本和字节版本已就绪。顺便说一句 ocamlc -custom deprecated .

    我希望揭开神秘的面纱。

        2
  •  1
  •   osiire    15 年前

    ocaml工具有点神秘 对我来说,

    我也这么认为。 你为什么不用奥马克?Omake使构建序列变得简单。 http://omake.metaprl.org/manual/omake-build.html#@fun272

        3
  •  1
  •   Norman Ramsey    15 年前

    我是OCAML的一个版本,但看起来 silly.cma sillystubs 链接的 动态地 ,因此您可能需要

    -ccopt -L${PWD} 
    

    在最后一行。

    而且,我看不出你在做什么需要额外的力量 ocamlfind -你也可以打电话来 ocamlc 直接。

    推荐文章