【问题标题】:How to compile ocaml to native code如何将ocaml编译为本机代码
【发布时间】:2015-11-24 02:45:36
【问题描述】:

我对学习 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

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

【问题讨论】:

  • 只是一个评论:你不需要在你显示的代码中的 Printf.sprintf。
  • 我第一次尝试从网络修改它(忘记地址)。我试过你的建议,你是对的,所以我从代码中删除了“Printf.sprintf”部分。谢谢。

标签: compilation ocaml native


【解决方案1】:

#load#directorytoplevel directives。他们指示 ocaml 在哪里可以找到 mysql 和 unix 库。对于本机(或字节码)编译,删除这些指令并将它们替换为相应的command-line flags#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 is for native code, .cma for bytecode. 命令行中文件名的顺序也很重要。

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

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

【讨论】:

  • 该命令有效,您的解释是真正的帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 2012-02-05
  • 2010-09-07
  • 1970-01-01
  • 2013-05-07
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多