使用Opam安装Z3的ocaml API

时间:2019-07-01 16:34:37

标签: c++ ocaml z3 opam

我想在我的OCaml程序中使用Z3。使用opam,我做到了

$ opam install z3
$ eval $(opam env)

然后尝试使用

进行编译
$ ocamlfind ocamlopt -o main -package z3 -linkpkg main.ml

我得到的是从{p>开始的数千In function foo undefined reference to bar的巨大转储。

/home/andrepd/.opam/4.06.1+flambda/lib/z3/libz3-static.a(api_datatype.o): In function `mk_datatype_decl':
api_datatype.cpp:(.text+0x4bf): undefined reference to `__cxa_allocate_exception'
api_datatype.cpp:(.text+0x522): undefined reference to `__cxa_throw'
api_datatype.cpp:(.text+0x57b): undefined reference to `__cxa_free_exception'
api_datatype.cpp:(.text+0x58f): undefined reference to `__cxa_allocate_exception'
api_datatype.cpp:(.text+0x5f9): undefined reference to `__cxa_throw'
api_datatype.cpp:(.text+0x61f): undefined reference to `__cxa_allocate_exception'
api_datatype.cpp:(.text+0x68b): undefined reference to `__cxa_throw'
...

结尾
binary_heap_upair_queue.cpp:(.text._ZN2lp23binary_heap_upair_queueIjE7dequeueERjS2_[_ZN2lp23binary_heap_upair_queueIjE7dequeueERjS2_]+0x1ab): undefined reference to `__cxa_allocate_exception'
binary_heap_upair_queue.cpp:(.text._ZN2lp23binary_heap_upair_queueIjE7dequeueERjS2_[_ZN2lp23binary_heap_upair_queueIjE7dequeueERjS2_]+0x205): undefined reference to `__cxa_throw'
binary_heap_upair_queue.cpp:(.text._ZN2lp23binary_heap_upair_queueIjE7dequeueERjS2_[_ZN2lp23binary_heap_upair_queueIjE7dequeueERjS2_]+0x226): undefined reference to `__cxa_free_exception'
/home/andrepd/.opam/4.06.1+flambda/lib/z3/libz3-static.a(binary_heap_upair_queue.o): In function `_GLOBAL__sub_I_binary_heap_upair_queue.cpp':
binary_heap_upair_queue.cpp:(.text.startup+0xc): undefined reference to `std::ios_base::Init::Init()'
binary_heap_upair_queue.cpp:(.text.startup+0x13): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
File "caml_startup", line 1:
Error: Error during linking
Command exited with code 2.

我在做什么错?作为记录,我使用的是ocamlbuild,

$ ocamlbuild -use-ocamlfind -cflag '-linkpkg' main.native
true: package(z3)文件中的

_tags。但是像上面那样调用普通ocamlfind会得到相同的输出。

版本:编译器:带有flambda的4.06.1,opam:2.0.0,z3:4.8.4。

1 个答案:

答案 0 :(得分:1)

TL; DR;包裹坏了。以下是修复程序和一些变通办法,但通常,此类问题应发布到相应的问题跟踪器。因此,请考虑打开问题报告或提出带有修复的请求。

那些链接器错误表明C ++标准库中的符号丢失。由于OCaml使用C链接器链接最终产品,因此默认情况下不会传递C ++标准库。当然,正确制作的软件包应该为我们 1 做到这一点,但是我们仍然可以通过-cclib -lstdc++手动进行此操作(如果您具有libstdc ++,则可以使用-lc++)。

ocamlfind ocamlopt -linkpkg -cclib -lstdc++ -package z3 example.ml -o exe

通过ocamlbuild,您可以使用cclib(x)参数化标记,例如

 <example.ml>: cclib(-lstdc++)

1 提供的META文件包含伪造的

linkopts = "-cclib -L/usr/lib"

,其中(a)没有意义,因为-L不是链接器选项,但是编译器之一没有作用,而(b)则毫无用处,因为/usr/lib通常仍在搜索路径中。

正确的选项应该是:

linkopts = "-cclib -lstdc++"

您可以直接编辑文件,该文件位于$(ocamlfind query z3)/META

请考虑对OPAM软件包或(理想情况下)对z3提交修订。