【发布时间】:2012-08-01 12:37:36
【问题描述】:
我需要交叉编译一些 C/C++ 库。该库依赖于几个 C/C++ 库。其中一些库又依赖于其他库。所有库都带有配置脚本。我知道如何在主机系统上编译和安装库——在我需要的库之前安装依赖项。显然这在交叉编译时不起作用。任何提示表示赞赏。谢谢。
【问题讨论】:
标签: c++ c autotools autoconf automake
我需要交叉编译一些 C/C++ 库。该库依赖于几个 C/C++ 库。其中一些库又依赖于其他库。所有库都带有配置脚本。我知道如何在主机系统上编译和安装库——在我需要的库之前安装依赖项。显然这在交叉编译时不起作用。任何提示表示赞赏。谢谢。
【问题讨论】:
标签: c++ c autotools autoconf automake
通常,要交叉编译自动工具包,您需要向./configure 传递几个额外的参数:--host 和--build。 --host 是构建程序将在其上运行的系统的名称,--build 是进行编译的系统的名称。
当我说“系统名称”时,我指的是ARCH-VENDOR-OS-LIBC 形式的元组。 (例如,i686-pc-linux-gnu 是描述我当前使用的系统的元组。)有时元组的某些部分被省略,例如 mingw32 工具链(在我的系统上,mingw32 交叉工具与元组 @ 一起安装) 987654328@ 和/或amd64-mingw32msvc)。
(configure还有一个参数--target,用于交叉编译编译器,并指定正在构建的编译器在生成代码时所针对的系统。)
每个工具链在/usr 下都有自己的子目录,例如/usr/i586-mingw32msvc。您将要在此处安装新软件包以便找到它们。对configure 使用--prefix 参数。
所以要从我的 GNU/Linux 系统交叉编译到 MinGW32 系统,我会像这样运行 configure:
./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc
因此,从依赖关系图的叶子开始,逐步向上。您可能还想将--enable-static --disable-shared 传递给configure:这将停止为 libtooled 包创建动态库。如果某个包需要在构建过程中运行某个程序,您可能需要在本地安装一些包并进行交叉编译。
有时configure 的测试会失败:例如,它会尝试编译和运行程序。通常这些测试会设置一个缓存变量,您也可以在命令行上将其传递给configure。同样,您可以覆盖程序路径和库编译/链接标志等内容。检查您的包裹的./configure --help。
【讨论】:
只要您确保针对目标系统而不是开发主机的头文件和库进行构建,针对交叉编译的共享库构建绝对没有问题。
即使您将所有明显的依赖项都构建为静态库,您可能仍然会发现自己链接到共享的 C 和 C++ 语言运行时库。您还需要确保用于交叉编译的头文件来自您的目标系统而不是开发主机。
大多数时候不这样做可能会奏效。在剩下的时间里,你会遇到微妙的难以调试的崩溃。
您如何实现这一点取决于您的跨工具链和目标环境如何。正如您都没有提到的那样,我猜测它是 GCC 和某种 Linux 作为开发主机和目标 - 尽管这些原则同样适用于使用其他开发主机。
交叉编译的 GCC 和 bin-utils 发行版通常是这样构建的,以便默认库和头文件搜索路径指向目标系统的根文件系统的副本。链接器将在此处查找要链接的共享库,并且在构建依赖共享库时,您将在此处安装它们。
您可以通过在命令行上将 --sysroot <mySysRoot> 选项传递给 GCC 来覆盖 GCC 的默认系统根目录。
【讨论】:
您需要做的是为所有依赖项创建静态库并将它们静态链接到您的可执行文件。您需要使用交叉编译器来生成这些库。你可以通过查找“mingw static link cross compile”找到一些很好的例子
【讨论】: