C++ 如何强制已安装的gcc ar使用特定的binutils版本?
我已经从源代码中构建了gcc4.9.3,并用一些前缀安装到我的主目录中,例如,C++ 如何强制已安装的gcc ar使用特定的binutils版本?,c++,linux,gcc,binutils,C++,Linux,Gcc,Binutils,我已经从源代码中构建了gcc4.9.3,并用一些前缀安装到我的主目录中,例如,gcc4.9 现在我想使用更新版本的binutils以及GCC4.9.3。我构建了它们,并分别安装在我的主目录中,前缀为binutils2.26 如何强制gcc-arfromgcc4.9使用arfrombinutils2.26而不是system one?它总是调用/usr/bin/ar,看起来没有可指定的选项。以某种方式替换/usr/bin/ar不是一个选项-我在此计算机上没有root访问权限。使用GCC的-B标志,并
gcc4.9
现在我想使用更新版本的binutils
以及GCC4.9.3。我构建了它们,并分别安装在我的主目录中,前缀为binutils2.26
如何强制
gcc-ar
fromgcc4.9
使用ar
frombinutils2.26
而不是system one?它总是调用/usr/bin/ar
,看起来没有可指定的选项。以某种方式替换/usr/bin/ar
不是一个选项-我在此计算机上没有root访问权限。使用GCC的-B
标志,并将其指向包含要执行的ar
的目录。有关此标志的详细信息,请参阅
gcc-ar -B/path/to/your/dir ...
这似乎对我有用:
$ strace -f -eexecve gcc-ar rc foo.a /dev/null |& grep /ar
[pid 14485] execve("/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/../../../../x86_64-pc-linux-gnu/bin/ar", [...]) = 0
$ strace -f -eexecve gcc-ar rc foo.a /dev/null -B/usr/bin |& grep /ar
[pid 14493] execve("/usr/bin/ar", [...]) = 0
$ strace -f -eexecve gcc-ar rc foo.a /dev/null -B/usr/x86_64-pc-linux-gnu/binutils-bin/2.26/ |& grep /ar
[pid 14500] execve("/usr/x86_64-pc-linux-gnu/binutils-bin/2.26/ar", [...]) = 0
使用GCC的
-B
标志,并将其指向包含要执行的ar
的目录。有关此标志的详细信息,请参阅
gcc-ar -B/path/to/your/dir ...
这似乎对我有用:
$ strace -f -eexecve gcc-ar rc foo.a /dev/null |& grep /ar
[pid 14485] execve("/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/../../../../x86_64-pc-linux-gnu/bin/ar", [...]) = 0
$ strace -f -eexecve gcc-ar rc foo.a /dev/null -B/usr/bin |& grep /ar
[pid 14493] execve("/usr/bin/ar", [...]) = 0
$ strace -f -eexecve gcc-ar rc foo.a /dev/null -B/usr/x86_64-pc-linux-gnu/binutils-bin/2.26/ |& grep /ar
[pid 14500] execve("/usr/x86_64-pc-linux-gnu/binutils-bin/2.26/ar", [...]) = 0
我设法解决了这个问题 使用
strace
,我发现gcc-ar
在多个目录中查找ar
,包括/libexec/gcc/x86\u 64-redhat-linux/4.9.3
因此,显而易见的解决方案是在此目录中创建指向相应的binutils2.26
可执行文件的链接:
cd”/libexec/gcc/x86_64-redhat-linux/4.9.3“
对于~/binutils2.26/bin/*中的文件;do ln-s“${file}”;完成
在这之后,
~/binutils2.26/bin
中的可执行文件将作为链接复制到GCC 4.9.3目录中,并在按该GCC版本构建时自动使用。我设法解决了这个问题
使用strace
,我发现gcc-ar
在多个目录中查找ar
,包括/libexec/gcc/x86\u 64-redhat-linux/4.9.3
因此,显而易见的解决方案是在此目录中创建指向相应的binutils2.26
可执行文件的链接:
cd”/libexec/gcc/x86_64-redhat-linux/4.9.3“
对于~/binutils2.26/bin/*中的文件;do ln-s“${file}”;完成
在这之后,
~/binutils2.26/bin
中的可执行文件将作为链接复制到GCC 4.9.3目录中,并在使用该GCC版本进行构建时自动使用。您应该意识到,在构建系统中,实际上(不允许它调用默认的GCC ar)。如何?我调用/home/foo/gcc4.9/gcc-ar
,但它仍然调用/usr/bin/ar
“如何?我调用/home/foo/gcc4.9/gcc-ar
”调用/home/foo/binutils2.26/ar
。它是否允许在为静态库编译对象时使用-flto
标志?抱歉,这超出了我的知识范围,关于这个话题,我需要自己做一些更深入的研究。您可能需要澄清有关该特定要求的问题。我只是想指出,通过在构建系统中设置相应的工具链定义变量(SAR
或其他任何变量),可以轻松地调用特定的ar
版本。您应该意识到,在构建系统中,实际上(不允许它调用默认的gcc-ar)。如何实现?我调用/home/foo/gcc4.9/gcc-ar
,但它仍然调用/usr/bin/ar
“如何?我调用/home/foo/gcc4.9/gcc-ar
”调用/home/foo/binutils2.26/ar
。它是否允许在为静态库编译对象时使用-flto
标志?抱歉,这超出了我的知识范围,关于这个话题,我需要自己做一些更深入的研究。您可能需要澄清有关该特定要求的问题。我只想指出,通过在构建系统中设置相应的工具链定义变量(SAR
或其他任何变量),可以轻松地调用特定的ar
版本。不幸的是,这对我不起作用,gcc ar
只是将此标志传递给/usr/bin/ar
…你救了我一天!:)不幸的是,这对我不起作用,gcc-ar
只是将此标志传递给/usr/bin/ar
…你救了我一天!:)