【问题标题】:Modify g++ library path修改g++库路径
【发布时间】:2015-04-24 04:18:45
【问题描述】:

我最近安装了gcc 4.9.2,发现与libs链接时出现问题。

搜索路径的输出:

install: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/
programs: =/usr/libexec/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/libexec/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/libexec/gcc/x86_64-unknown-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/bin/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/bin/
libraries: =/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/../lib64/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib64/:/lib/x86_64-unknown-linux-gnu/4.9.2/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../:/lib/:/usr/lib/

真的,问题是这样的:

/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib64/

我需要更改这两个库的顺序(使 lib64 具有更高的搜索优先级),因为两个目录都有 libstdc++.so.6,我需要使用 lib64 文件夹中的那个。

我该怎么做?

请不要:

1,建议我更改 LD_LIBRARY_PATH 以明确包含 libstdc++.so.6,因为我确信 x86_64-linux-gnu 文件夹中还有其他东西是 lib64 文件夹中的旧版本 - 我从旧版本。

2,建议我在 g++ -L 选项中明确包含 lib64/libstdc++.so.6。

非常感谢。

/************************编辑了解更多信息****************** ******/

根据下面的要求,这里有一些关于配置和安装的更多细节(我从 gcc.gnu.org 下载了 4.9.2 源,解压并在 4.9.2 顶级文件夹中启动):

mkdir ../gcc-build                                   &&
cd    ../gcc-build                                   &&

../gcc-4.9.2/configure                               \
    --prefix=/usr                                    \
    --libdir=/usr/lib                                \
    --enable-shared                                  \
    --enable-threads=posix                           \
    --enable-__cxa_atexit                            \
    --disable-multilib                               \
    --with-system-zlib                               \
    --enable-languages=c,c++ &&
make

【问题讨论】:

  • 你是如何安装 GCC 的(你安装了一些软件包吗?)?在哪个 Linux 发行版上?你自己编译的吗?你是怎么.../configure它的?请编辑您的问题以提供更多详细信息!
  • @BasileStarynkevitch 你好,Basile。我已经用更多细节更新了我的问题。 Linux 发行版是 Kali。
  • 您的系统gcc 是如何配置的?尝试例如gcc-4.8 -v ?
  • 您在哪个系统(例如,什么 Linux 发行版和版本)上执行此操作?您可能已经将系统损坏到需要重新安装的程度!
  • @BasileStarynkevitch Kali linux,最新的 1.0.7(作为早期版本安装,我在安装 gcc 4.9.2 之前将其升级到最新版本)。我安装的 gcc 确实有些奇怪。作为一种临时解决方法,我在 LD_LIBRARY_PATH 中设置了 lib 路径,它工作得很好——直到我用 gdb 调试它。我尝试使用 -g 进行编译,并在另一个实验中使用 -ggdb。在这两种情况下,都没有为当前堆栈中的任何变量找到符号。然后我将 gdb 更新到最新的 7.9 并没有变得更好。我确定我的 gcc 安装有问题。但是怎么会呢?

标签: c++ gcc linker shared-objects g++4.9


【解决方案1】:

您可以拥有一个新的(或修改现有的)GCC specs 文件,文档为 here

AFAIK,specs 文件位于您的“安装”目录中,因此您将位于
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/specs(如果它不存在,您可以创建它)。

AFAIK 有一些内置默认值,但您可以将系统配置为具有明确的默认值。

还可以阅读 GCC 的 debugging options。您可能想使用-dumpspecs 来获取内置的默认规范。

详细信息可能与您的系统高度相关,尤其是当您从其源代码编译 GCC 时。

我对@9​​87654329@ 文件不够熟悉,无法为您的特定问题提供可靠的解决方案。详情请咨询gcc-help@gcc.gnu.org


NB:我倾向于认为将gcc 配置为--prefix=/usr(而不是像默认--prefix=/usr/local/ 或某些--prefix=/opt/ 等这样的非系统前缀)是一个错误(或在最少也使用--program-suffix=-4.9)。您可能会将您的gcc 与系统gcc 混淆;如果您想替换您的系统 gcc(这可能很危险),您应该使用与系统 gcc 相同的参数配置新的 gcc。请注意,/usr/bin/gcc -v 告诉您您的系统 gcc 是如何配置的(在覆盖之前完成)。

在某些较旧的系统上编译最近的 GCC 4.9 时,我通常建议使用 --prefix=/usr/local/--program-suffix=-4.9 对其进行配置,然后将 /usr/local/bin/ 添加到您的 $PATH,并使用 make CC=gcc-4.9 CXX=g++-4.9 使用它构建程序。

【讨论】:

  • 嗨,Basile:我找到了解决问题的方法:我确保我的 /etc/ld.so.conf 在 /usr/lib/x86_64-linux- 之前有 /usr/lib64 gnu/ 和 g++(真的,ld 开始工作正常)然后开始链接没有问题(现在确实有一个警告当我做 ldconfig: ldconfig: /usr/lib64/libstdc++.so.6.0.20-gdb. py 不是 ELF 文件 - 它在开始时有错误的魔法字节。) - 但这并不重要,如下所述:readlist.com/lists/gcc.gnu.org/gcc-help/6/32889.html
  • 此外,当我使用 gdb 进行调试时发生的奇怪事情 - 它也消失了。也就是说,之前由于目录设置不合适,gdb也无法运行(我得出这个结论是因为我没有用g++重新编译,这意味着之前所有的符号肯定已经生成了,只是gdb找不到它/使用它)。感谢您花时间跟进此问题并撰写回复 - 我很感激 :)
猜你喜欢
  • 2014-06-05
  • 2013-01-27
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2013-01-06
  • 2015-09-28
相关资源
最近更新 更多