我正在为CS类组织一个介绍OCaml项目,其中一部分涉及实现列表操作。我希望他们能够使用Pervasives,但不能使用List或任何其他标准库模块。有没有办法设置ocamlbuild,所以它只能链接到标准库中的Pervasives?编译OCaml时不要链接所有标准库模块
回答
我看到两个机会:要么直接从OCaml标准库中删除模块,要么通过用具有不同(可能为空)签名的模块重载来隐藏它们。
第一个变体需要编辑OCaml发行Makefiles。使用opam并没有那么可怕,实际上,您可以轻松地修补OCaml,并将每个修补后的OCaml作为单独的编译器分发。要从stdlib存档中删除模块,您需要编辑stdlib/Makefile.shared
,stdlib/StdlibModules
和stdlib.mllib
。您已经删除不需要的模块后,你可以这样做:
./configure
make world.opt
make install
另一个选项是(AB)使用的ocamlc
的-open
命令行参数。当这个选项被指定为一个模块的名称时,这个模块将在编译的程序中自动打开。例如,你可以写在标准库中自己的叠加,具有以下接口(minimal.mli
):
module List = sig end (* or whatever you want to expose *)
,然后你就可以编译要么ocamlc -open minimal ...
,或与ocamlbuild
:ocamlbuild -cflags -open,minimal ...
(你也可以使用_tags
文件传递开放标志,或者写一个ocamlbuild插件)。
您可以使用编译器的-nostdlib
选项,但会隐藏Pervasives
和List
。
你想要的东西很难实现,因为两个编译单元都是同一个库存档的一部分,即stdlib.cma
。
你也许会尝试编译自己的Pervasives
副本并使用上面的标志。
很好的答案。 @SaxSalute:确保将pervasives.cm [oi]放在工作目录中,但不要放置.ml。你真的不希望你的学生看这个代码。 – PatJ
- 1. OCAML模块类型和模块编译
- 2. OCaml模块的单独编译
- 3. ocaml中的链接模块出错
- 4. 未能链接OCaml-Java中的标准库
- 5. 未能链接到标准库的Ocaml-java(或Cafesterol)
- 6. 任何AS3库需要用标准模式而不是严格模式编译?
- 7. 如何链接库来手动编译/安装Perl模块?
- 8. 编译和链接时,不同C/C++模块之间有什么交流?
- 9. 链接到内核模块预编译的目标文件
- 10. 使用其他模块编译和链接模块
- 11. VS2017 C++标准库模块
- 12. 链接库是编译时间链接到另一个库
- 13. C++标准库中的所有函数都需要外部链接吗?
- 14. 使用MinGW编译时链接GLEW库
- 15. 编译python扩展模块时链接错误
- 16. 我如何获得所有Python标准库模块的列表
- 17. GCC链接器找不到标准库?
- 18. 在编译时链接vs在运行时链接到std ::库
- 19. 编译动态链接库
- 20. 编译Boost链接库(Ubuntu)
- 21. 编译动态链接库
- 22. iOS编译和链接库
- 23. 编译WindRiver Linux内核模块与标准桌面版本有什么不同?
- 24. 在解释和编译模式下包含OCaml模块
- 25. C++标准库链接与不同的C++标准
- 26. 在ocaml中包含模块中的所有模块
- 27. 编译要在C++构建中链接的C库...是否需要指定C++标准?
- 28. C++ Builder(XE7)编译时没有链接?
- 29. 块范围链接C标准
- 30. 编译标志不适用静态链接库
我认为出于我们的目的,用空白模块签名隐藏List模块是一个完美的解决方案!我不知道为什么我没有想到这一点。非常感谢! – SaxSalute