【问题标题】:Cross compilation: GCC ignores --sysroot交叉编译:GCC 忽略 --sysroot
【发布时间】:2013-07-10 07:19:54
【问题描述】:

我正在尝试使用来自 Linux Mint 的 64 位存储库的 arm-linux-gnueabi-gcc 为诺基亚 N9 手机交叉编译程序(当前是来自 libav 的 avconv)。编译器的libc版本是2.15,手机有libc-2.10.1。它们在数学库中不兼容,当我从 libav 编译和运行 avconv 程序时,这给了我一个段错误。

我需要针对较旧的 libc 版本进行编译和链接,但我还没有设法让 --sysroot 选项起作用。

我做了一个小测试程序,避免重复配置和编译libav。

arm-linux-gnueabi-gcc --sysroot=/opt/CrossCompilation/NokiaN9/ -o output.sysroot hello.c
arm-linux-gnueabi-gcc -o output.nosysroot hello.c

两个命令都创建一个相同的输出文件。这就是hello.c 的样子:

#include <stdio.h>
#include <math.h>

int main() {
    printf("Hello, World! Sin = %f\n", sin(0.6451));
}

最奇怪的是 gcc 完全忽略了--sysroot 选项。如果我将一个不存在的目录传递给 sysroot,它仍然会产生完全相同的输出二进制文件:

arm-linux-gnueabi-gcc --sysroot=/foo/bar -o output.foobar hello.c

它甚至不会抱怨任何错误。有什么问题?

【问题讨论】:

  • arm-linux-gnueabi-gcc -v运行编译器,查看--with-sysroot的值;这是编译器构建的目录。如果您的机器上有这个目录(可能使用不同的编译器),那么--sysroot 可能不起作用。 gcc 版本是什么?
  • 没有定义“--with-sysroot”。 gcc 是 4.6.3 版
  • 但是 'grep /usr/arm' 发现 "--with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.6.3", "-- includeir=/usr/arm-linux-gnueabi/include”、“--with-headers=/usr/arm-linux-gnueabi/include”和“--with-libs=/usr/arm-linux-gnueabi/库”。
  • --with-libs 表示您的gcc 是在没有--sysroot 支持的情况下编译的。

标签: gcc arm cross-compiling


【解决方案1】:

由于我在阅读 cmets 之前浪费了几天的时间,所以我将发布 artless noise 的 cmets 作为答案:

"使用arm-linux-gnueabi-gcc -v 运行编译器并查看--with-sysroot 的值;这是编译器构建时使用的目录。如果您的机器上有此目录(可能使用不同的编译器),那么--sysroot 可能不起作用[;如果您没有看到--with-sysroot 而是看到--with-libs,这] 意味着您的gcc 是在没有--sysroot 支持的情况下编译的。”

【讨论】:

  • 有什么解决办法吗?
  • 我已经有一段时间没有搞砸这个了,但是如果你有--with-libs 而不是--with-sysroot,也许可以使用它?或下载另一个工具链,或构建自己的工具链。
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2012-02-17
  • 1970-01-01
  • 2019-07-18
  • 2021-12-21
相关资源
最近更新 更多