告诉omake使用C库的静态版本

时间:2018-07-26 23:19:19

标签: ocaml protobuf-c omake

我正在使用omake构建本机二进制可执行文件。链接并尝试运行它后,它无法运行,并显示以下错误:

  

加载共享库时出错:libprotobuf-c.so.1:无法打开共享库文件:没有这样的文件或目录

在编译时是否有办法告诉可执行文件选择静态版本:libprotobuf-c.a而不是共享版本?

2 个答案:

答案 0 :(得分:1)

我对omake不熟悉,但我相信您要查找的ocamlc的标志是dllpath

   -dllpath dir
          Adds  the  directory dir to the run-time search path for shared C libraries.  At link-
          time, shared libraries are searched in the standard search path (the one corresponding
          to  the  -I option).  The -dllpath option simply stores dir in the produced executable
          file, where ocamlrun(1) can find it and use it.

如果您可以配置omake来将适当的-dllpath参数传递给ocamlc,那么您应该一切顺利。

我不知道这是使用GNU链接器rpath的{​​{1}}功能(运行时库搜索路径)。参见https://linux.die.net/man/1/ld。还有一个ld实用程序可以更改已构建的可执行文件的chrpath

另一个选项是在设置了rpath的情况下运行可执行文件,以便共享库位于加载路径上。如果合适,您也可以在整个共享库系统上安装。最后一种选择是在应用程序使用LD_LIBRARY_PATH引导时手动加载库。

正确的选择取决于您将如何分发此文件以及最终将分发给谁。请记住,如果您使用dlopen / rpath,则最终用户不太可能将dllpath安装在与您相同的位置。

答案 1 :(得分:0)

似乎没有可以传递给链接器ld的全局标志,该标志强制链接器在可用时将静态库优先于动态库。就我而言,我明确设置了库名称,如下所示:

OCAML_LINK_FLAGS += -cclib -l:libprotobuf-c.a