【问题标题】:Decoding gcc specs file line解码 gcc 规范文件行
【发布时间】:2012-07-26 04:42:42
【问题描述】:

我在两个版本之间对 g++ 的隐式 LIBRARY_PATH 修改有疑问(g++ -v 提供了此信息)。我将 LIBRARY_PATH 设置为具有自定义库的单个本地目录。然而,事实证明只有一个版本的 g++(我们称之为版本 A)正确链接,另一个(版本 B)链接到系统默认值,这是不希望的。显然,目录的顺序混淆了,我的规范没有得到适当的尊重。这是与LIBRARY_PATH not used before /usr/lib anymore in gcc 4.2 and later? 类似的问题,尽管这些版本没有。

不知何故,我产生了查看两个不同版本的规格文件的想法(通过g++ -dumpspecs > specs 获得它们)。然后,我尝试查看使用另一个版本 (A) 的规范文件运行 g++ 版本(B;产生 *un*expected 修改)是否仍会产生该修改,令我松了一口气的是 LIBRARY_PATH 现在完全一样我期待它(匹配版本 A)!

我进一步追踪了这个奇怪的修改发生在以下行的位置:

. !m64 !m32;.:../lib64 m64 !m32;.:../lib32 !m64 m32;

除了似乎影响 LIBRARY_PATH 的设置/修改之外,我很遗憾不知道这条线的含义。 因此,我希望你们中的一些人能够“破译”这行并解释它的含义,以便我可以根据自己的要求尝试修改它。

谢谢!

【问题讨论】:

    标签: gcc replace line specs


    【解决方案1】:

    该行会影响相对于 GCC 的 $PREFIX/lib 目录(其中 $PREFIX 是 GCC 安装到的目录)查找库的方式。

    它分为三个部分:

    $PREFIX/lib/. 在命令行上既没有使用-m32 也没有使用-m64 时使用。

    $PREFIX/lib/.:$PREFIX/lib/../lib64在使用-m64时使用。

    $PREFIX/lib/.:$PREFIX/lib/../lib32在使用-m32时使用。

    这表明您使用的是 Debian 或 Ubuntu,我认为从 FSF 源构建的 vanilla GCC 不会在规范中具有此功能。您的 GCC 版本都是来自 .deb 软件包还是您自己安装的? (最近 Debian/Ubuntu 版本中的 Multi Arch 支持移动了库目录,因此破坏了原版 GCC,我认为 Debian 和 Ubuntu 修补了它们的 .deb 包的 GCC 代码。)

    您能否为每个版本添加与g++ -v 链接的输出,以查看每个版本使用的确切库搜索路径?

    另外,为什么不直接使用-L 而不是LIBRARY_PATH?用-L 指定的目录总是在最前面,在系统目录或GCC 自己的目录或LIBRARY_PATH 指定的目录之前。

    【讨论】:

    • 非常感谢,这可能会很有帮助。 g++ 版本。 A 实际上是 Debian 提供的系统范围的编译器。另一个(版本 B)带有一个名为 easybuild 的系统,用于管理多用户系统上的安装和版本处理(可能有显着不同的工具和版本需求)。我认为整体设置是针对这个站点的,因此我不想在那里详细介绍。我不想使用“-L”,因为必须明确设置(根据定义),我认为使用“LIBRARY_PATH”将是一种通用、透明的解决方案,以保证“安全”默认链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多