gpt4 book ai didi

compilation - 如何将 ocaml 编译为 native 代码

转载 作者:行者123 更新时间:2023-12-03 10:00:43 27 4
gpt4 key购买 nike

我对学习 ocaml 真的很感兴趣,它很快(他们说它可以编译为 native 代码)并且它很实用。所以我尝试编写一些简单的代码,比如启用 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 解释器上运行良好,但是当我尝试将其编译为 native 时(我使用的是 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

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

最佳答案

#load#directorytoplevel directives .它们指示 ocaml 在哪里可以找到 mysql 和 unix 库。对于 native (或字节码)编译,删除这些指令并将它们替换为相应的 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 

关于compilation - 如何将 ocaml 编译为 native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2672577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com