我没有在Windows 7上使用z3 ocaml绑定。 这是我遵循的过程。
启动ocaml interactive并加载“z3.cma”
# #load "z3.cma";;
Characters -1--1:
#load "z3.cma";;
Error: The external function `get_theory_callbacks' is not available
# Z3.mk_context;;
Characters -1--1:
Z3.mk_context;;
Error: The external function `camlidl_z3_Z3_mk_context' is not available
有人可以给我一些提示吗?
编辑1: 在“Z3-3.0 \ examples \ ocaml”中构建示例:
摘自 build.cmd
set XCFLAGS=/nologo /MT /DWIN32
ocamlopt -ccopt "%XCFLAGS%" -o test_mlapi.exe -I ..\..\ocaml ole32.lib %OCAMLLIB%\libcamlidl.lib z3.cmxa test_mlapi.ml
在 Visual Studio 2008命令提示符中执行 build.cmd 时遇到以下错误
** Fatal error: Cannot find file "/nologo"
File "caml_startup", line 1, characters 0-1:
Error: Error during linking
在删除-ccopt "%XCFLAGS%"
时,它可以正常工作。生成的 exe 也按预期执行。 (注意我在PATH中有flexdll)。知道为什么会这样吗?
答案 0 :(得分:3)
OCaml 3.11及更高版本通过flexdll调用链接器,它不需要或不知道“/ nologo / MT / DWIN32”标志。 ocaml \ build.cmd脚本测试ocaml版本并适当地设置XCFLAGS。我想应该改变例子\ ocaml \ build.cmd来做同样的事情。
如果我通过从Z3 ocaml绑定目录执行'ocamlmktop -o ocamlz3 z3.cma'创建自定义顶层,则使用顶层中的Z3对我有用。
答案 1 :(得分:2)
这对我有用(Windows 7):
config/Makefile.win32
重命名为config/Makefile
config/Makefile
BINLIB
和OCAMLLIB
个变量
Makefile
make all
make install
C:\Program Files\flexdll\
和C:\Program Files\Microsoft Research\Z3-<version-number>\bin\
添加到Path变量中
C:\Program Files\Microsoft Research\Z3-<version-number>\ocaml
build.cmd
%CD%
变量
build.cmd
build.cmd
z3/ocaml
复制到%OCAMLLIB%
ocamlmktop -o ocamlz3 z3.cma %OCAMLLIB%\libcamlidl.lib ole32.lib
ocamlz3.exe
#use "../examples/ocaml/test_mlapi.ml";;
尝试simple_example();;
最后一步应该从Z3产生有效的输出。
对于Debian / Ubuntu:
sudo apt-get install camlidl
git clone git://github.com/polazarus/z3-installer.git
(来自MickaëlDelahaye) cd z3-installer
make
#下载Z3并构建Ocaml库(本机和字节) sudo make install
#install Z3二进制文件,DLL和Ocaml库 sudo cp z3/lib/libz3.so /usr/lib/
cd z3/ocaml
ocamlmktop -o ocamlz3 z3.cma
/ocamlz3
let simple_example() =
begin
Printf.printf "\nsimple_example\n";
let ctx = Z3.mk_context_x (Array.append [|("MODEL", "true")|] [||]) in
Printf.printf "CONTEXT:\n%sEND OF CONTEXT\n" (Z3.context_to_string ctx);
Z3.del_context ctx;
end;;
simple_example();;