我没有给每次从源代码构建的GCC 5.2调用-Wl,-rpath=$HOME/local/gcc52/lib64
,而是以这种方式修改了它的spec
文件:
*link_command:
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) -rpath=%:getenv(HOME /local/gcc52/lib64) ...
但这取决于$HOME/local/gcc52
下的具体安装。有没有更好的方法来引用调用的GCC本身的安装路径?
本手册页对我没什么帮助:
答案 0 :(得分:2)
据我所知,GCC非常依赖于它编译的安装文件夹。我经常构建RTEMS交叉编译工具链,我学到的第一件事就是在生成的交叉编译器中有多个位置,其中安装前缀(即传递给{{1的任何内容)被烧伤"烧伤"英寸
"教训" - 就像在,我试图将编译器的文件夹移动到另一条路径,并且一切都崩溃了: - )
我的观点:就GCC而言,修改--exec-prefix
文件使它们指向安装中的路径似乎绝对正常。
答案 1 :(得分:0)
当您编译GCC时,无论如何都需要将所需的前缀传递给configure
。那时,你也可以给它--with-specs
选项。根据我的实验,选项--with-specs='%{!static:%x{-rpath='$prefix'/lib64} %x{-enable-new-dtags}}'
(其中$prefix should be replaced by the same path you pass to
- 前缀`)可以工作(当然,您需要更复杂的多点支持)。
注意事项:
--with-specs
configure选项适用于传递给GCC本身的命令行参数。因此,您不能只是尝试修改*link
规范字符串。%x
序列不会更改GCC命令行,但会累积参数以传递给链接器。这就是为什么我直接通过-rpath
和-enable-new-dtags
而不是通过-Wl
。*link
之类的规范字符串,这是--with-specs
无法做到的,或者他们使用-Wl
向GCC命令行添加选项,我很确定有人说他们遇到了麻烦,因为在某些情况下,当他们没有链接时,它会混淆GCC。 YMMV。RUNPATH
GCC计划和共享图书馆也是如此。这似乎是正确的选择,因为它们是针对现在位于$prefix/lib64
的库进行编译的,但值得注意。我添加了-enable-new-dtags
,将其放在DT_RUNPATH
而不是DT_RPATH
中。这是所有文档中应该首选的较新属性,< sarcasm>这就是为什么它需要一个额外的标志,在文档< / sarcasm>中没有明确的交叉引用。 RPATH和RUNPATH之间的区别包括:
LD_LIBRARY_PATH
; RUNPATH没有。RUNPATH
仅搜索直接依赖关系;只要依赖关系链中没有任何内容RPATH
,就会搜索RUNPATH
的间接依赖关系。有关详细信息,请here。正如我在上面链接的文章所指出的,并非所有人都喜欢RUNPATH到RPATH,但这里不应该是一个问题,除非你混合来自不同编译器的代码,需要不同的编译器支持库以复杂的方式,如果你那样做我不要认为有任何一刀切的解决方案。