【问题标题】:How to hard code a dynamic library path on Linux如何在 Linux 上硬编码动态库路径
【发布时间】:2015-05-09 19:13:32
【问题描述】:

我想在我的可执行文件中硬编码库的路径,在 Linux 中。在 OS X 上,这是通过在构建库时在 -o 参数之后提供完整路径来实现的。例如,我在 OS X 上构建了一个这样的库:

cc foo.c --shared -o /home/sander/libfoo.so

当我构建一个名为“bar”的可执行文件并与该库链接时,我在可执行文件上使用 otool -L,我得到以下输出:

bar:
    /home/sander/libfoo.so (compatibility version 0.0.0, current version 0.0.0)

我现在可以从任何地方运行这个可执行文件,而且它总是能够找到库。

我正在寻找具有 gcc 的 Linux 上的等效功能。我宁愿不使用 rpath,因为它不会链接到特定的库 + 路径。

【问题讨论】:

  • 有什么理由不能只静态链接?如果您担心物品被移动,那似乎是更安全的选择。
  • 我无法静态链接。此功能是包管理系统的一部分,我必须能够更新单个包。我不太关心被移动的图书馆。更重要的是,我可以从系统上的任何位置找到这些库。

标签: c linux gcc shared-libraries dynamic-linking


【解决方案1】:

这样编译就行了,不要使用-llib,而是指定为编译对象:

cd /full/path/to/lib
gcc -shared -fpic -o liblib.so lib.c             # make the lib
gcc -c -o prog.o prog.c                          # compile program
gcc -o prog prog.o "/full/path/to/lib/liblib.so" # link everything together

编辑: 我最初写道,在 OS X 上,在 -o 选项之后指定绝对路径还是相对路径并不重要。那是不正确。它确实会影响 Mach-O LC_ID_DYLIB load 命令中库的“名称”。感谢@Sander Mertens 让我知道。

【讨论】:

  • 谢谢,成功了!我不同意 -o 虽然。 otool 显示在与该库链接时使用您在 -o 之后指定的任何内容。我刚刚在 OS X 上再次验证,根据 -o 的参数,otool 显示不同的输出。
  • @SanderMertens 对此感到抱歉,感谢您让我知道。编辑答案。
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 2011-01-07
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多