我正在使用omake构建本机二进制可执行文件。链接并尝试运行它后,它无法运行,并显示以下错误:
加载共享库时出错:libprotobuf-c.so.1:无法打开共享库文件:没有这样的文件或目录
在编译时是否有办法告诉可执行文件选择静态版本:libprotobuf-c.a而不是共享版本?
答案 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