我需要交叉编译一些C / C ++库。该库依赖于几个C / C ++库。其中一些库反过来依赖于其他库。所有库都附带配置脚本。我知道如何在主机系统上编译和安装库 - 在我需要的lib之前安装依赖项。显然,这在交叉编译时不起作用。任何提示都表示赞赏。谢谢。
答案 0 :(得分:10)
通常,要交叉编译自动课程包,您需要向./configure
--host
传递一些额外的参数:--build
和--host
。 --build
是运行构建程序的系统的名称,ARCH-VENDOR-OS-LIBC
是进行编译的系统的名称。
当我说“系统名称”时,我指的是i686-pc-linux-gnu
形式的元组。 (例如i586-mingw32msvc
是描述我正在使用的系统的元组。)有时候元组的部分被省略了,就像mingw32工具链一样(在我的系统上,mingw32交叉工具安装了元组amd64-mingw32msvc
和/或--target
)。
(还有另一个参数配置,/usr
,用于交叉编译编译器,并指定生成代码时正在构建的编译器将作为目标的系统。)
每个工具链在/usr/i586-mingw32msvc
下都有自己的子目录,例如--prefix
。您将要在此处安装新软件包,以便找到它们。使用configure
的{{1}}参数。
所以要从我的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
。
答案 1 :(得分:3)
构建针对交叉编译的共享库绝对没有问题,只要您确保构建针对目标系统而不是开发主机的头文件和库。
即使您将所有明显的依赖项构建为静态库,您仍可能会发现自己链接到共享的C和C ++语言运行时库。您还需要确保用于交叉编译的头文件是来自目标系统而不是开发主机的头文件 不这样做可能大部分时间都可以工作。剩下的时间你会得到微妙的难以调试的崩溃。
如何实现这一点取决于您的跨工具链和目标环境。正如你所提到的那样,我会猜测它是GCC和某些Linux作为开发主机和目标 - 尽管这些原则同样适用于使用其他开发主机。
通常构建交叉编译GCC和bin-utils发行版,以便默认库和标题搜索路径指向目标系统根文件系统的副本。这是链接器将查找要链接的共享库的位置,在此处您可以在构建时安装依赖的共享库。
您可以通过在命令行上将--sysroot <mySysRoot>
选项传递给GCC来覆盖GCC的默认系统根目录。
答案 2 :(得分:1)
您需要做的是为所有依赖项创建静态库,并将它们静态链接到您的可执行文件。您需要使用交叉编译器来生成这些库。你可以通过查找“mingw static link cross compile”找到一些很好的例子