【问题标题】:Cross compiling with automake使用 automake 进行交叉编译
【发布时间】:2013-05-10 12:04:48
【问题描述】:

我正在尝试交叉编译一个项目和它所依赖的库,以便在嵌入式系统上使用。应用程序和依赖项都使用 automake。我能够毫无问题地编译该库。

./configure --host=powerpc-none-linux-gnuspe --prefix=/home/me/build_dir
make
make install

我使用了--prefix,所以make install 没有将输出与所有x86 库一起放入我的文件系统中。我也尝试过在没有--prefix 的情况下运行configure,而是在运行make install 之前设置DESTDIR 环境变量。他们似乎在做同样的事情。我希望能够压缩/home/me/build_dir 并将其放到嵌入式目标文件系统的根目录中。我希望--prefix 没有在我的主机某处硬编码绝对路径。

然后我尝试交叉编译使用这个库的应用程序:

./configure --host=powerpc-none-linux-gnuspe --with-sysroot=/home/me/build_dir

我遇到了两件事。配置脚本成功完成,但第一次制作失败,因为它找不到其中一个标头。它正在查看/usr/include 而不是/home/be/build_dir/usr/include--with-sysroot 选项不应该也修改包含目录还是我遗漏了什么?

另外,我收到了警告

libtool: link: warning: library libstdc++.la was moved

我觉得我错过了一些东西。这个警告是我可以安全忽略的还是我在某个地方搞砸了?

总结一下我的问题: 1)./configure --prefix=xmake DESTDIR=x install有区别吗? 2)更新库头的搜索路径的正确方法是什么? 3) 为什么我会收到关于 libstdc++ 的警告,我应该担心吗?

【问题讨论】:

    标签: cross-compiling gnu gnu-make automake


    【解决方案1】:

    根据您的情况,您应该使用DESTDIR。设置--prefix 意味着生成的程序将安装在--prefix 的位置。另一方面,DESTDIR 是一个纯粹的 make install 工件,它只是在安装时将其添加到每个路径的开头。生成的产品仍希望安装在--prefix 位置。如果您想在目标主机上安装结果,请将--prefix 设置为它将去的位置并使用DESTDIR 将其暂存到其他位置。

    我相信仅在configure 脚本中设置--sysroot 是不够的,但我不确定。我认为这会在 configure 运行时设置 sysroot,但不会设置 makefile。

    我通常做的是为编译器创建一个shell脚本包装器,它使用正确的--sysroot=dir选项调用真正的编译器,然后使用该包装器作为configure的编译器名称。这样做比尝试让编译器的所有调用在外部添加--sysroot 标志更简单。

    我不确定libstdc++ 警告。 libstdc++ 是编译器的一部分,而不是 sysroot 的一部分...?

    预计到达时间:

    通过脚本包装器,我的意思是创建一个名为 sysroot-gcc: 的脚本:

    #!/bin/sh
    exec real-gcc --sysroot=/some/sysroot "$@"
    

    然后你可以运行configure CC=sysroot-gcc。您可以随心所欲地制作它;我有一个通用脚本,它解析名称 ($0) 并从中获取 sysroot 名称和工具名称(gccg++ 等),因此我可以为所有工具重用该脚本。

    【讨论】:

    • 感谢您提供有用的信息。我不确定我理解你所说的 shell 脚本包装器是什么意思。
    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2013-02-20
    相关资源
    最近更新 更多