用于指定具有绝对路径的库的GCC行为是什么

时间:2017-12-27 18:35:25

标签: c++ gcc

GCC(链接)在使用绝对路径指定时无法找到库。请注意我想要的原因是我有一个构建系统,它通过绝对路径保存所有库,因此它可以保留一组有序的唯一条目。

g++ (...) -L/path/to -llibrary.so

我看到一个错误报告,其中有些人认为这是一个错误,其他人认为它曾经工作过的事实是一个错误,而且它已经修复了。

有人进行了一些讨论,必须在路径之前加上':'

无论如何都没有成功。

因此,为了在构建系统中进行测试,我将代码插入以截断绝对库路径,如果它是"前缀"匹配指定给GCC的任何库路径并截断绝对库路径。

g++ (...) -L/path/to -l/path/to/library.so

这很有用。
我也试过这个。

status == some_status

它有效。 9(虽然调查..看起来这是构建脚本中的错误)

似乎可能是为GCC指定的任何搜索路径都是"前缀"到使用绝对路径指定的库,它找到库。我还假设它在所提供的库路径的有序列表中首次命中。

所以我的问题。

  • 这是受支持的行为吗?
  • 在此构建脚本中截断绝对库路径或传递绝对路径是否更好。

我注意到这里提出的一些相关问题:

How to link using GCC without -l nor hardcoding path for a library that does not follow the libNAME.so naming convention?

这表示"未搜索"完整的道路是"烧毁"一个可执行文件,从而在执行时覆盖任何运行时库路径?它是否正确 ?如果是这样意味着在命令行上使用完整路径指定库是不合适的。部署时,构建的应用程序和相关库将安装在标准的可搜索位置。

2 个答案:

答案 0 :(得分:1)

我想说在这种情况下不要使用-l,只需将完整的库路径作为命令的一部分传递:  gcc(其他选项)/path/to/library.so

答案 1 :(得分:0)

注意:这是使用gcc(Raspbian 4.9.2-10)4.9.2我正在为它构建一个库集。

好的 - 多敲打它并测试不同的案例

使用完整路径作为GCC的参数显然会在硬编码的绝对路径中烧录到库中,该库在运行时用于解析它的位置。这不是所希望的,因为应用程序旨在与可搜索的共享库一起部署,这些库可能最终位于不同的位置。

-llibmyLib.so   does not work with a search path. 
-lmyLib         does work with a search path 
     ( with lib prefix and suffix removed - apparently 
       it tries all available suffi and prepends "lib" for it's 
       search by default )

-

-l:libmyLib.so   DOES work with a search path, 
               as ':' specifies the file name is not to be altered.

-l:debug/libmyLib.so DOES work ( a  subdir under the search path )
-l:release/libmyLib.so DOES work ( a subdir under the search path )

有了这些信息 - (显然)知道它的作用我现在可以继续前进!!