我正在使用 omake 构建本机二进制可执行文件。链接后我尝试运行它,它无法运行并出现以下错误:
加载共享库时出错:libprotobuf-c.so.1:无法打开共享对象文件:没有这样的文件或目录
有没有办法在编译时告诉可执行文件选择静态版本:libprotobuf-ca 而不是 shared on?
我正在使用 omake 构建本机二进制可执行文件。链接后我尝试运行它,它无法运行并出现以下错误:
加载共享库时出错:libprotobuf-c.so.1:无法打开共享对象文件:没有这样的文件或目录
有没有办法在编译时告诉可执行文件选择静态版本:libprotobuf-ca 而不是 shared on?
我不熟悉,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
特性(运行时库搜索路径) 。ld
见https://linux.die.net/man/1/ld。还有一个chrpath
实用程序可以更改rpath
已构建的可执行文件。
另一种选择是使用LD_LIBRARY_PATH
set 运行可执行文件,以便共享库位于加载路径上。如果合适,您还可以在系统范围内安装共享库。最后一个选择是在应用程序启动时手动加载库,使用dlopen
.
正确的选择取决于您将如何分发它以及分发给谁(如果有的话)。请记住,如果您使用rpath
/dllpath
最终用户不太可能protobuf
安装在您所做的相同位置。
似乎没有可以传递给链接器 ld 的全局标志,它强制链接器在可用时更喜欢静态库而不是动态库。就我而言,我像这样明确设置库名称:
OCAML_LINK_FLAGS += -cclib -l:libprotobuf-c.a