0

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

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

有没有办法在编译时告诉可执行文件选择静态版本:libprotobuf-ca 而不是 shared on?

4

2 回答 2

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特性(运行时库搜索路径) 。ldhttps://linux.die.net/man/1/ld。还有一个chrpath实用程序可以更改rpath已构建的可执行文件。

另一种选择是使用LD_LIBRARY_PATHset 运行可执行文件,以便共享库位于加载路径上。如果合适,您还可以在系统范围内安装共享库。最后一个选择是在应用程序启动时手动加载库,使用dlopen.

正确的选择取决于您将如何分发它以及分发给谁(如果有的话)。请记住,如果您使用rpath/dllpath最终用户不太可能protobuf安装在您所做的相同位置。

于 2018-07-27T18:28:16.963 回答
0

似乎没有可以传递给链接器 ld 的全局标志,它强制链接器在可用时更喜欢静态库而不是动态库。就我而言,我像这样明确设置库名称:

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

于 2018-07-30T13:17:01.720 回答