gcc - 解码 gcc 规范文件行

标签 gcc replace line specs

我在两个版本之间对 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;这会产生*意外*预期的修改)是否仍然会产生该修改,令我欣慰的是,LIBRARY_PATH 现在与我预料到了(匹配版本 A)!

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

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

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

谢谢!

最佳答案

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

它分为三个部分:

$PREFIX/lib/. 在命令行上未使用 -m32-m64 时使用。

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

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

这对我来说表明您正在使用 Debian 或 Ubuntu,我认为来自 FSF 源代码的普通 GCC 版本不会在规范中包含这些内容。您的 GCC 版本是来自 .deb 软件包还是您自己安装的? (最近 Debian/Ubuntu 版本中的 Multi Arch 支持会移动库目录,从而破坏了原生 GCC,我认为 Debian 和 Ubuntu 为其 .deb 包修补了 GCC 代码。)

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

另外,为什么不直接使用 -L 而不是 LIBRARY_PATH 呢?使用 -L 指定的目录始终排在第一位,位于系统目录或 GCC 自己的目录或 LIBRARY_PATH 中指定的目录之前。

关于gcc - 解码 gcc 规范文件行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11688893/

相关文章:

c++ - 在 Raspbian 上使用 C++ 线程,无法编译

c++ - g++ -fno-enforce-eh-specs - 为什么/如何违反 C++ 标准?

c++ - 无法将 boost 库与 CMake 链接

javascript - 在 html/PHP 中使用 javascript 更改变音符号颜色

c++ - std::sort 仿函数一行

objective-c - 计算垂直于另一条线的中点的线

c - GNU 内联汇编程序——汇编指令的语法?

php - 用 PHP 正则表达式替换单词或单词组合

javascript - 使用 JS .split 并多次连接数组。它只运行最后一对

android - 用渐变画线