在我的项目中,我有一个使用Core.Std的文件,所以我已经运行了
opam install core
Run Code Online (Sandbox Code Playgroud)
并补充说
open Core.Std
Run Code Online (Sandbox Code Playgroud)
在我的档案中.
我跑的时候
ocamlbuild myprogram.native
Run Code Online (Sandbox Code Playgroud)
它说:
Error: Unbound module Core
Run Code Online (Sandbox Code Playgroud)
指向上面的open语句.
所以,我试试这个:
ocamlbuild -use-ocamlfind -pkgs core.std myprogram.native
Run Code Online (Sandbox Code Playgroud)
并获得以下消息:
ocamlfind: Package `core.std' not found
Run Code Online (Sandbox Code Playgroud)
所以我想也许我需要运行opam install core.std,但显然根据opam没有这样的东西.我也试过"打开Core.Std ;;" 在ocaml repl中,但这也不起作用.有任何想法吗?
从构建使用列表理解帖子的OCaml代码,我可以使用较少的构建选项_tags来执行文件ocamlbuild.
$ cat _tags
<**/*> : package(camlp4),syntax(camlp4o),package(pa_comprehension)
Run Code Online (Sandbox Code Playgroud)
从电池介绍,我还需要有_tags文件来使用电池包.
<*>: package(batteries)
Run Code Online (Sandbox Code Playgroud)
为什么第一个示例<**/*>在第二个示例使用时使用<*>?一般来说,ocamlbuild中_tags文件的目的是什么?你有一些很好的教程吗?
我正在尝试使用ocamlbuild而不是make,但我无法正确链接我的目标文件与外部.cma库.似乎ocamlbuild首先尝试确定依赖关系然后忽略标记-L/path/to/lib.cma.随着make我只是路过所有必需的目录与-I和-L标志来ocamlc,但这些似乎并没有一起工作ocamlbuild- ocamlc不断失败,因为它无法找到必要的库.
我有一个包含OCaml .ml文件和Menhir .mly文件的项目.我使用ocamlbuild来编译项目.
我的_tags文件包含这一行:
true: use_menhir, package(batteries)
Run Code Online (Sandbox Code Playgroud)
一切都很好,除非我想在.mly文件中使用电池.如果我open Batteries ;;之间%{并%}呼吁ocamlbuild时:在我.mly文件,我得到"未绑定模块电池错误".
似乎当ocamlbuild调用menhir时,就像这样:
/usr/bin/menhir --ocamlc '/usr/bin/ocamlfind ocamlc' --infer parser.mly
Run Code Online (Sandbox Code Playgroud)
它会忘记-package batteries在--ocamlcmenhir选项中添加(或等效的东西).
我该如何解决这个问题?也许我的_tags文件中的.mly文件的特殊规则可以帮助吗?或者它是一个ocamlbuild错误?
我找到了许多关于如何.o使用C源构建文件的指南ocamlbuild.但是,这些不适用于C++文件,它们ocamlbuild无法开箱即用.
我试图写一个myocamlbuild.ml提供从规则文件(请求后如下图所示).cpp,以.o和失败,ocamlc抱怨不知道该怎么做一个.cpp文件(即使当编译器设置为g++通过命令行标志).
open Ocamlbuild_plugin ;;
let ext_obj = !Options.ext_obj;;
let x_o = "%"-.-ext_obj;;
rule "ocaml C++ stubs: cpp -> o"
~prod:x_o
~dep:"%.cpp"
begin fun env _build ->
let c = env "%.cpp" in
let o = env x_o in
let comp =
if Tags.mem "native" (tags_of_pathname c) then !Options.ocamlopt else !Options.ocamlc in
let cc =
Cmd(S[comp; T(tags_of_pathname c++"c"++"compile"); A"-custom"; A"-cc"; A"g++"; A"-c"; …Run Code Online (Sandbox Code Playgroud) 我正在使用oasis来构建我的ocaml项目,源代码存在于一个名为src的目录中.绿洲构建文件看起来像这样:
OASISFormat: 0.4
Name: Test
Version: 0.1
Synopsis: no
Authors: Me
License: BSD-3-clause
Plugins: META (0.4)
Executable abc
Path: src
BuildTools: ocamlbuild
MainIs: main.ml
Run Code Online (Sandbox Code Playgroud)
现在我想将文件组织到子文件夹中,将a.mli和a.ml放入src/util中.执行此操作后,模块对ocamlbuild/ocamlc不可见,从而导致"未绑定的模块A"错误.如果我手动调用ocamlc,我可以添加-I src/util标志以使a.mli再次可见.
如何在不使文件完整库的情况下向绿洲配置添加其他路径?
我尝试使用Opam提供的Ocaml版本编译Ocaml项目.我的ocamlbuild,ocamlfind和绿洲似乎没问题:
/Users/fred/.opam/4.02.1/bin/ocamlbuild
dhcp-182-73:compil fred$ which ocamlfind
/Users/fred/.opam/4.02.1/bin/ocamlfind
dhcp-182-73:compil fred$ which oasis
/Users/fred/.opam/4.02.1/bin/oasis
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时,似乎调用了错误的ocamlbuild版本,甚至ocamlfind的版本也是正确的,我认为它解释了为什么ocamlfind无法找到sexplib库.
$ make
ocaml setup.ml -build
Finished, 0 targets (0 cached) in 00:00:00.
+ /Users/fred/.opam/system/bin/ocamlfind ocamldep -package threads -package sexplib.syntax -package core -package comparelib.syntax -modules src/tricot/tricot.mli > src/tricot/tricot.mli.depends
ocamlfind: Package `sexplib.syntax' not found
Command exited with code 2.
Compilation unsuccessful after building 1 target (0 cached) in 00:00:00.
E: Failure("Command ''/usr/local/bin/ocamlbuild' src/tricot/tricot.cma src/tricot/tricot.cmxa src/tricot/tricot.a src/tricot/tricot.cmxs src/compil/compil.cma src/compil/compil.cmxa src/compil/compil.a src/compil/compil.cmxs src/main.native -use-ocamlfind -tag debug' terminated with error code 10") …Run Code Online (Sandbox Code Playgroud) 我正在使用ocamlbuild对ocamlfind的本机支持来简化我的项目的构建过程.文件foo.ml依赖于使用camlp4宏的条件编译.该_tags文件包含以下内容:
<foo.ml>: package(camlp4.macro), syntax(camlp4o)
Run Code Online (Sandbox Code Playgroud)
这很好用,但我无法将选项传递给camlp4.不使用ocamlbuild + ocamlfind自动化,命令行将是这样的:
camlp4o pa_macro.cmo -DFOO file.ml
Run Code Online (Sandbox Code Playgroud)
但是-DFOO在使用ocamlbuild + ocamlfind时如何将变量传递给camlp4?我觉得应该有一个简单的命令行选项,而不是乱七八糟myocamlbuild.ml.
如何使用Ocamlbuild构建启用的配置文件信息?它似乎-p不起作用.
现在,我用ocamlopt它.例如,
$ ocamlfind ocamlopt -c -p -thread -package core test.ml
$ ocamlfind ocamlopt -p -o test -thread -package core -linkpkg test.cmx
Run Code Online (Sandbox Code Playgroud)
怎么做同样的
ocamlbuild -user-ocamlfind test.native
Run Code Online (Sandbox Code Playgroud) 我是OCaml的新手.当我在Ocaml中使用数组进行编码时,我遇到了一个我无法理解的问题.
这是代码:
let a = Array.create 5 (Array.create 5 0);
a.(0).(1) <- 1
Run Code Online (Sandbox Code Playgroud)
我只想将1分配给[0] [1]但事情发生了:第一个colummn中的所有元素都已分配.也就是说,代码后[0] [1],[1] [1],[2] [1],[3] [1]和[4] [1]都等于1以上执行.
如果我使用以下方法创建数组:
Array.make_matrix 5 5 0
Run Code Online (Sandbox Code Playgroud)
一切都好.
我的环境:
Ubuntu 13.10
Ocaml 4.01.0
open Core.Std
Run Code Online (Sandbox Code Playgroud)