繁体   English   中英

如何交叉编译C ++ - 具有依赖关系的库?

[英]How to cross-compile C++-library with dependencies?

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

通常,要交叉编译自动化程序包,可以将一些额外的参数传递给./configure : - --host--build --host是运行构建程序的系统的名称, - --build是执行编译的系统的名称。

当我说“系统名称”时,我指的是ARCH-VENDOR-OS-LIBC形式的元组。 (例如i686-pc-linux-gnu是描述我正在使用的系统的元组。)有时候元组的部分被省略了,就像mingw32工具链一样(在我的系统上,安装了mingw32交叉工具)使用元组i586-mingw32msvc和/或amd64-mingw32msvc )。

(还有另一个配置参数, - --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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM