2017-10-05 106 views
1

我是OCaml的新手,但我试图找出来自Node的相当于__filename__dirname。也就是说,我需要建立一个路径相对到包含相关代码的文件。OCaml:如何获取当前模块的路径* /我的项目目录?


仅供参考,我通过Ghuloum说的IACC工作:http://ell.io/tt$ocameel

我建立我的第一个编译器,我有一个完全简单化的“运行”文件(在C - temporarily)毗邻编译器的源代码。我需要能够将路径传递给此文件,作为参数(或预编译版本,我想)到gcc或我的链接器,以便在我调用链接器/汇编程序工具时将其链接到我的编译器输出。 (这可能是一个愚蠢的问题 - 我在这里有一个未知的未知数,“编译器如何获得链接器的运行时间”,或者类似的东西。关于惯用解决方案的任何评论这是值得欢迎的,即使它不是一个直接回答上面的问题!)

回答

2

如果您是通过ocaml myfile.ml直接运行源文件,Sys.argv.(0)会给你的路径源文件,你可以使用Filename.dirname来从那里获取目录。

如果您首先将源文件编译为可执行文件,然后运行可执行文件,则Sys.argv.(0)会给出可执行文件的名称。在这种情况下,不可能获得源代码的位置(特别是如果您认为运行可执行文件的人可能甚至没有在他们的系统上的源代码)。

如果您设置了项目结构,以便您的源代码位于src /中,bin /中已编译的二进制文件以及lib /中已编译的stdlib,则可以使用Filename.dirname Sys.argv.(0)^"../lib"作为gcc的库路径。无论您在将所有内容安装到/usr/还是/usr/local/之后,运行ocaml src/mycompiler.mlbin/mycompiler或仅运行mycompiler都可以运行。

+0

是的,这就是我开始担心的,在我的问题的一半。我想我需要弄清楚编译器编写者是如何将附加资源运送给用户的。我想我可能不得不将文本(或链接到的对象?)插入到二进制文件中? :x谢谢,这对于脚本情况来说是一个很好的答案! – ELLIOTTCABLE

+0

@ELLIOTTCABLE如果你的项目按我的最后一段所描述的那样布置,它应该只适用于'argv。(0)'。如果您有需要访问的其他资源,则可以将它们放入共享/并执行相同的操作。请注意,如果您的stdlib是动态链接的,并且您没有安装到标准路径,那么在运行编译后的二进制文件时,您还需要设置LD_LIBRARY_PATH以查找.so,但这是无关紧要的问题。 – sepp2k

相关问题