我正在玩OCaml.我想知道如何做的第一件事是建立一个OCaml项目.现在,我只是想要一些简单的东西,因为我刚学习.任何人都可以指向构建系统以及使用该构建系统的"hello world"类型示例吗?
我有一个大型OCaml项目,我正在使用ocamlbuild进行编译.一切正常,我有一个伟大的可执行文件,可以按我的要求完成所有操作.问题是,当我把原生可执行文件"my_prog.native"运行到其他地方(不同的机器使用相同的操作系统等)时,新机器抱怨它找不到洋甘菊(用于电池)库我正在使用).我认为我们从ocamlbuild得到了可执行文件是独立的,不需要的OCaml或甘菊存在于我们跑了机器,但似乎并不如此.
关于如何制作真正的独立可执行文件的任何想法?
我试图保持我的项目自包含,在项目存储库中构建和引用所有主要的第三方库依赖项.我的项目的主要ocaml部分依赖于ocamlbuild.
但是对于像Batteries Included这样的复杂软件包,人们强烈期望通过ocamlfind将它们链接到一个项目中.ocamlfind似乎假设将在全局安装软件包.(我意识到它允许环境变量及其conf指向备用位置,但它基本上似乎仍然围绕包全局配置的假设构建 - 它没有相应的-I或-L标志来动态扩展包的搜索路径,例如.有可能设置环境变量来动态覆盖ocamlfind配置来搜索项目本地树,但这比仅仅参数更难以实现,而且如果没有同时删除它也似乎很难主要系统包的可发现性site-lib,也可能是必需的.)
对于使用ocamlbuild的项目,在项目本地树中构建和构建非平凡的第三方软件包有什么理智的策略?
我对将库添加到链接器的顺序存在问题.ocamlbuild以前构建的库链接在flag规则包含的库列表之后.而且,我也没有看到任何方法来定义这种类型的依赖myocamlbuild.ml.
具体来说,问题在于链接以前构建的库(gzcaml)需要库本身(z).由于较新版本的gcc增加了严格性,因此参数-lz必须出现在后面libgzcaml.a.
我包括所有这些库,
flag ["ocaml"; "link"]
(S (process "-cclib" clibs))
Run Code Online (Sandbox Code Playgroud)
在哪里process创建一个交替库和A"-cclib"适当的列表.
此外,附加了额外的库(从详细输出,-lm和-ldl),但我不知道如何修改/追加这些?(这会立即解决我的问题).
我myocamlbuild.ml很长时间没把它包括在这里.我已经尝试将上面的代码移到底部After_rules,到顶部.它确实改变了顺序,但从未在ocamlbuild之前创建的构建库(c和其他)之后.
编辑 下面是我在配置脚本和ocamlbuild中使用的代码片段,以解决上述问题.干杯!
在 configure.ac
oCFLAGS="$CFLAGS"
CFLAGS="$FLAGS -Wl,--no-as-needed"
AC_MSG_CHECKING([whether we need to add --no-as-needed linking option])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],
[[
int main(){ return 0; }
]])],
[AC_MSG_RESULT([yes]); CC_NOASNEEDED="true"],
[AC_MSG_RESULT([no]); CC_NOASNEEDED="false"])
CFLAGS=$oCFLAGS
Run Code Online (Sandbox Code Playgroud)
在 myocamlbuild.ml.in
if @CC_NOASNEEDED@ then
flag ["ocaml"; "link"]
(S [A"-cclib";A"-Wl,--no-as-needed"]);
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个OCaml二进制文件main.native,main.ml它依赖于单个C文件custom.c来实现一个新的原语.需要编译和链接此C文件.有没有办法只用一个_tags文件来做到这一点?显而易见的问题是OCamlbuild在扫描时没有检测到依赖关系main.ml,因此需要明确告知依赖关系.
ocamlbuild main.native
Run Code Online (Sandbox Code Playgroud)
OCamlbuild知道将*.c文件编译为*.o文件的规则,但我不知道如何添加依赖项.
-S在使用ocamlbuild和corebuild命令构建时,我想将标志传递给ocamlopt.
我知道做ocamlbuild -cflag -S ...不会起作用,因为-Sflag仅存在于ocamlopt而不是ocamlc.
如何使用_tags文件执行此操作?
我是一名新的OCaml用户.我已经问了一个问题,以了解如何设置一个基本的OCaml项目,但我仍然有问题.跳到最后为TL; DR
例如,我正在努力学习Irmin.在Irmin的主页上,我看到我必须这样做
opam install irmin git cohttp
Run Code Online (Sandbox Code Playgroud)
这样做,我最终得到了Irmin版本0.8.3.不幸的是,我不能按照他们的例子,因为显然Irmin的版本是0.9.4,看起来API已经改变了.所以,我想开始一个只有Irmin 0.9.4依赖的干净项目
首先,我已经设置了一个opam开关
opam switch install playground -A 4.02.1
Run Code Online (Sandbox Code Playgroud)
一定要在干净的石板上工作.然后,我创建了一个_oasis看起来像这样的基本文件
OASISFormat: 0.4
Name: Playground
Version: 0.1.0
Synopsis: OCaml playground
Authors: Andrea Ferretti
License: Apache-2.0
BuildTools: ocamlbuild
BuildDepends:
irmin,
irmin.unix,
lwt,
lwt.unix
Run Code Online (Sandbox Code Playgroud)
然后我复制了Irmin主页中的例子example.ml.
open Lwt
open Irmin_unix
let store = Irmin.basic (module Irmin_git.FS) (module Irmin.Contents.String)
let config = Irmin_git.config ~root:"/tmp/irmin/test" ~bare:true ()
let prog =
Irmin.create store config task >>= fun t -> …Run Code Online (Sandbox Code Playgroud) 我正在使用camlp4.macro来启用条件编译.我在通知OCamlbuild时遇到问题,标记为"use_jscore"的某些文件必须使用给定的camlp4选项进行预处理.这是我目前的情况:
let _ = dispatch begin function
| After_rules ->
flag ["ocaml"; "use_jscore"] (S[A"-package"; A"camlp4.macro"; A"-syntax"; A"camlp4o"; A"-ppopt"; A"-DUSE_JSCORE"]);
Run Code Online (Sandbox Code Playgroud)
但OCamlbuild完全没错了.我正在使用ocamlfind,所以基本上我想告诉OCamlbuild的是所有标记为"use_jscore"的OCaml文件必须由camlp4.macro预处理,同样也给出了-DUSE_JSCORE选项.
我有一个名为ojasmine的本地固定OPAM项目,我希望将其编译为一个库,供另一个名为test_tournabox的项目使用(最终编译为javascript).但是,test_tournabox的编译失败并出现链接错误.
我按如下方式编译ojasmine,给出目标ojasmine.cma:
ocamlbuild -cflag -annot -use-ocamlfind -pkgs js_of_ocaml.log,js_of_ocaml,js_of_ocaml.syntax -syntax camlp4o ojasmine.cma
Finished, 5 targets (5 cached) in 00:00:00.
Run Code Online (Sandbox Code Playgroud)
然后我像这样安装它:
ocamlfind install ojasmine META _build/ojasmine.cma
Run Code Online (Sandbox Code Playgroud)
我发现很奇怪ojasmine.cma不在我的项目目录中,而是在_build目录中.
输出是:
Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/ojasmine.cma
Installed /home/laheadle/.opam/4.02.0/lib/ojasmine/META
Run Code Online (Sandbox Code Playgroud)
接下来,我cd到我的tournabox项目并尝试构建测试套件:
ocamlbuild -cflag -annot -use-ocamlfind -pkgs js_of_ocaml.log,js_of_ocaml,js_of_ocaml.syntax,ojasmine -syntax camlp4o test_tournabox.byte
+ ocamlfind ocamlc -linkpkg -syntax camlp4o -package ojasmine -package js_of_ocaml.syntax -package js_of_ocaml -package js_of_ocaml.log choice.cmo util.cmo entry.cmo ttypes.cmo columns.cmo countries.cmo country_group.cmo jsutil.cmo performance_group.cmo round_group.cmo seed_group.cmo tlog.cmo tourney.cmo tournabox_lib.cmo test_tournabox.cmo -o test_tournabox.byte
Run Code Online (Sandbox Code Playgroud)
这失败并出现错误:
Error: Error while linking test_tournabox.cmo:
Reference …Run Code Online (Sandbox Code Playgroud) 我的问题与此类似,但是,在我的情况下.ocamlinit已设置。
这是我的 ocaml 版本。
\n\nmymac:Desktop myusr$ ocaml --version\nThe OCaml toplevel, version 4.08.1\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的 opam 版本。
\n\nmymac:Desktop myusr$ opam --version\n2.0.5\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的 opam 开关。
\n\nmymac:Desktop myusr$ opam switch\n# switch compiler description\n\xe2\x86\x92 4.08.1 ocaml-base-compiler.4.08.1 4.08.1\n default ocaml-base-compiler.4.08.1 default\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的.ocamlinit:
mymac:Desktop myusr$ cat ~/.ocamlinit\n(* ## added by OPAM user-setup for ocamltop / base ## 3ec62baf6f9c219ae06d9814069da862 ## you can edit, but keep this line *)\n#use "topfind";;\n(* ## end of OPAM user-setup addition …Run Code Online (Sandbox Code Playgroud) ocaml ×10
ocamlbuild ×10
build-system ×1
c ×1
camlp4 ×1
js-of-ocaml ×1
linker ×1
oasis ×1
ocamlfind ×1
opam ×1