告诉 omake 使用静态版本的 c 库
Telling omake to use static version of a c library
我正在使用 omake 构建本机二进制可执行文件。链接后我尝试 运行 它,它无法 运行 给出以下错误:
error while loading shared libraries: libprotobuf-c.so.1: cannot open shared object file: No such file or directory
有没有办法在编译时告诉可执行文件选择静态版本:libprotobuf-c.a 而不是共享版本?
我不熟悉 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 链接器 ld
的 rpath
功能(运行时库搜索路径)。请参阅 https://linux.die.net/man/1/ld。还有一个 chrpath
实用程序可以更改已构建的可执行文件的 rpath
。
另一个选项是 运行 设置了 LD_LIBRARY_PATH
的可执行文件,以便共享库位于加载路径上。如果合适,您还可以在系统范围内安装共享库。最后一个选项是在您的应用程序使用 dlopen
.
启动时手动加载库
正确的选择取决于您将如何分发以及分发给谁(如果有的话)。请记住,如果您使用 rpath
/dllpath
,最终用户不太可能将 protobuf
安装在与您相同的位置。
似乎没有可以传递给链接器 ld 的全局标志,它强制链接器在可用时更喜欢静态库而不是动态库。在我的例子中,我明确地设置了库名称,如下所示:
OCAML_LINK_FLAGS += -cclib -l:libprotobuf-c.a
我正在使用 omake 构建本机二进制可执行文件。链接后我尝试 运行 它,它无法 运行 给出以下错误:
error while loading shared libraries: libprotobuf-c.so.1: cannot open shared object file: No such file or directory
有没有办法在编译时告诉可执行文件选择静态版本:libprotobuf-c.a 而不是共享版本?
我不熟悉 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 链接器 ld
的 rpath
功能(运行时库搜索路径)。请参阅 https://linux.die.net/man/1/ld。还有一个 chrpath
实用程序可以更改已构建的可执行文件的 rpath
。
另一个选项是 运行 设置了 LD_LIBRARY_PATH
的可执行文件,以便共享库位于加载路径上。如果合适,您还可以在系统范围内安装共享库。最后一个选项是在您的应用程序使用 dlopen
.
正确的选择取决于您将如何分发以及分发给谁(如果有的话)。请记住,如果您使用 rpath
/dllpath
,最终用户不太可能将 protobuf
安装在与您相同的位置。
似乎没有可以传递给链接器 ld 的全局标志,它强制链接器在可用时更喜欢静态库而不是动态库。在我的例子中,我明确地设置了库名称,如下所示:
OCAML_LINK_FLAGS += -cclib -l:libprotobuf-c.a