如何将ocaml编译为本机代码

发布于 2024-08-29 20:31:05 字数 1186 浏览 5 评论 0原文

我真的很感兴趣学习 ocaml,它很快(他们说它可以编译为本机代码)并且它很实用。所以我尝试编写一些简单的代码,例如启用 mysql 事件调度程序。

#load "unix.cma";;
#directory "+mysql";;
#load "mysql.cma";;
let db = Mysql.quick_connect
  ~user:"username"
  ~password:"userpassword"
  ~database:"databasename"();;
let sql =
    "SET GLOBAL EVENT_SCHEDULER=1;"
    in
    (Mysql.exec db sql);;

它在 ocaml 解释器上工作正常,但是当我尝试将其编译为本机(我使用的是 ubuntu karmic)时,这些命令都不起作用,

ocamlopt -o mysqleventon mysqleventon.ml unix.cmxa mysql.cmxa
ocamlopt -o mysqleventon mysqleventon.ml unix.cma mysql.cma

我也尝试了

ocamlc -c mysqleventon.ml unix.cma mysql.cma

所有这些命令,产生了相同的消息

File "mysqleventon.ml", line 1, characters 0-1:
Error: Syntax error

然后我尝试删除“# load” ,所以代码是这样的

let db = Mysql.quick_connect
  ~user:"username"
  ~password:"userpassword"
  ~database:"databasename"();;
let sql =
    "SET GLOBAL EVENT_SCHEDULER=1;"
    in
    (Mysql.exec db sql);;

ocamlopt 结果消息

File "mysqleventon.ml", line 1, characters 9-28:
Error: Unbound value Mysql.quick_connect

我希望有人能告诉我,我哪里做错了。

i'm really interested learning ocaml, it fast (they said it could be compiled to native code) and it's functional. So i tried to code something easy like enabling mysql event scheduler.

#load "unix.cma";;
#directory "+mysql";;
#load "mysql.cma";;
let db = Mysql.quick_connect
  ~user:"username"
  ~password:"userpassword"
  ~database:"databasename"();;
let sql =
    "SET GLOBAL EVENT_SCHEDULER=1;"
    in
    (Mysql.exec db sql);;

It work fine on ocaml interpreter, but when i was trying to compile it to native (i'm using ubuntu karmic), neither of these command worked

ocamlopt -o mysqleventon mysqleventon.ml unix.cmxa mysql.cmxa
ocamlopt -o mysqleventon mysqleventon.ml unix.cma mysql.cma

i also tried

ocamlc -c mysqleventon.ml unix.cma mysql.cma

all of them resulting same message

File "mysqleventon.ml", line 1, characters 0-1:
Error: Syntax error

Then i tried to remove the "# load", so the code goes like this

let db = Mysql.quick_connect
  ~user:"username"
  ~password:"userpassword"
  ~database:"databasename"();;
let sql =
    "SET GLOBAL EVENT_SCHEDULER=1;"
    in
    (Mysql.exec db sql);;

The ocamlopt resulting message

File "mysqleventon.ml", line 1, characters 9-28:
Error: Unbound value Mysql.quick_connect

I hope someone could tell me, where did i'm doing wrong.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等数载,海棠开 2024-09-05 20:31:05

#load#directory顶级指令。它们指示 ocaml 在哪里可以找到 mysql 和 unix 库。对于本机(或字节码)编译,请删除这些指令并将其替换为相应的 命令行标志#load 仅映射到文件名,#directory 映射到 -I。因此对于字节码:

ocamlc unix.cma -I +mysql mysql.cma mysqleventon.ml -o mysqleventon

本机代码:

ocamlopt unix.cmxa -I +mysql mysql.cmxa -o mysqleventon mysqleventon.ml

注意: .cmxa 用于本机代码,.cma对于字节码。 命令行上的文件名顺序也很重要。

或者更好地使用 ocamlfind 并且不用担心路径和扩展名:

ocamlfind ocamlopt -package unix,mysql -linkpkg mysqleventon.ml -o mysqleventon 

#load and #directory are the toplevel directives. They instruct ocaml where to find mysql and unix libraries. For native (or bytecode) compilation remove those directives and replace them with corresponding command-line flags. #load maps just to the file name and #directory to -I. So for bytecode:

ocamlc unix.cma -I +mysql mysql.cma mysqleventon.ml -o mysqleventon

Native code:

ocamlopt unix.cmxa -I +mysql mysql.cmxa -o mysqleventon mysqleventon.ml

NB: .cmxa is for native code, .cma for bytecode. Also the order of filenames on command-line matters.

Or better use ocamlfind and don't worry about paths and extensions :

ocamlfind ocamlopt -package unix,mysql -linkpkg mysqleventon.ml -o mysqleventon 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文