9

我需要交叉编译一些 C/C++ 库。该库依赖于几个 C/C++ 库。其中一些库又依赖于其他库。所有库都带有配置脚本。我知道如何在主机系统上编译和安装库——在我需要的库之前安装依赖项。显然这在交叉编译时不起作用。任何提示表示赞赏。谢谢你。

4

3 回答 3

11

通常,要交叉编译一个自动工具包,您需要将几个额外的参数传递给./configure:--host--build. --host是构建程序将在其上运行--build的系统的名称,并且是进行编译的系统的名称。

当我说“系统的名称”时,我的意思是表单的元组ARCH-VENDOR-OS-LIBC。(例如i686-pc-linux-gnu,描述我当前使用的系统的元组。)有时会省略元组的某些部分,例如 mingw32 工具链(在我的系统上,mingw32 交叉工具与元组i586-mingw32msvc和/或一起安装amd64-mingw32msvc) .

(configure 还有另一个参数,--target用于交叉编译编译器,并指定正在构建的编译器在生成代码时将针对的系统。)

每个工具链都有自己的子目录,/usr例如/usr/i586-mingw32msvc. 您将要在此处安装新软件包以便找到它们。使用--prefix参数来configure

所以要从我的 GNU/Linux 系统交叉编译到 MinGW32 系统,我会这样运行configure

./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc

因此,从依赖关系图的叶子开始,逐步向上。您可能还想传递--enable-static --disable-sharedconfigure: 这将停止为 libtooled 包创建动态库。如果包需要在构建过程中运行程序,您可能必须在本地安装一些包以及交叉编译它们。

有时configure的测试会失败:例如,它试图编译和运行程序。通常这些测试设置一个缓存变量,您也可以在命令行上将其传递给configure. 同样,您可以覆盖程序路径和库编译/链接标志等内容。检查您的包裹的./configure --help.

于 2012-08-03T22:14:00.863 回答
3

只要您确保针对目标系统而不是开发主机的头文件和库进行构建,针对交叉编译的共享库构建绝对没有问题。

即使您将所有明显的依赖项构建为静态库,您可能仍然会发现自己链接到共享的 C 和 C++ 语言运行时库。您还需要确保用于交叉编译的头文件来自您的目标系统而不是开发主机。
大多数时候不这样做可能会奏效。在剩下的时间里,你会遇到微妙的难以调试的崩溃。

您如何实现这一点取决于您的跨工具链和目标环境的方式。正如您都没有提到的那样,我猜测它是 GCC 和某种 Linux 作为开发主机和目标 - 尽管这些原则同样适用于使用其他开发主机。

交叉编译的 GCC 和 bin-utils 发行版通常是这样构建的,以便默认库和头文件搜索路径指向目标系统的根文件系统的副本。链接器将在此处查找要链接的共享库,并且在构建依赖共享库时,您将在此处安装它们。

--sysroot <mySysRoot>您可以通过在命令行上将选项传递给 GCC 来覆盖 GCC 的默认系统根目录。

于 2012-08-03T16:22:14.173 回答
1

您需要做的是为所有依赖项创建静态库并将它们静态链接到您的可执行文件。您需要使用交叉编译器来生成这些库。您可以通过查找“min​​gw static link cross compile”找到一些好的示例

于 2012-08-03T13:04:30.993 回答