c - 交叉编译时如何使用外部库?

我正在为 x86 ubuntu 机器上的树莓派 ARM 目标编写一些代码。我正在使用 gcc-linaro-armhf 工具链。我能够在 pi 上交叉编译和运行一些独立的程序。现在,我想将我的代码与 ncurses 等外部库链接。我怎样才能做到这一点。

我是否应该将我的程序与主机上现有的 ncurses 库链接,然后在 ARM 上运行? (我认为这行不通) 我是否需要为 arm 获取源代码或预编译版本的 lib,将其放入我的 lib 路径然后编译?

在这种情况下最好的做法是什么?

我还想知道它对 c 标准库的工作原理。在我的程序中,我使用了 stdio 函数,它在交叉编译后工作,没有做任何特别的事情。我刚刚在 makefile 中为我的 arm gcc 提供了路径。所以,我想知道,它是如何得到正确的标准头文件和库的?

最佳答案

关于您的一般问题:

C 库为何有效:

C 库是您的交叉工具链的一部分。这就是找到 header 并且程序正确链接和运行的原因。对于其他一些非常基本的系统库,如 libm 和 libstdc++ 也是如此(并非在每种情况下,都取决于工具链配置)。

一般来说,在处理交叉开发时,您需要一些方法来交叉编译您想要的库。在这种情况下使用二进制文件是非常罕见的。也就是说,尤其是 ARM 硬件,因为有很多不同的配置,而且通常所有东西都以不同的方式被剥离。这就是为什么二进制文件在不同设备和 Linux 配置之间不太兼容的原因。

如果您在 Raspberry Pi 上运行 Ubuntu,那么您可能会在 Internet 甚至某些 Ubuntu apt 存储库中找到合适的 ncurses 库。然而,典型的方法是使用您拥有的特定工具链交叉编译库。

在需要交叉编译大量复杂库的情况下,有一些解决方案可以让工作变得更轻松一些,例如 buildroot 或 ptxdist。这些程序为嵌入式设备构建了完整的 Linux 内核和根文件系统。

但是,在您的情况下,只要您只需要 ncurses,您就可以自己编译源代码。您只需要下载源代码,运行 configure,同时使用 --host 选项指定您的工具链。 --prefix 选项将选择安装目录。运行 makemake install 后,考虑到一切正常,您将获得一组头文件和 ARM 编译库供您的应用程序链接。

关于交叉编译,您肯定会在互联网上找到大量信息,也许 ncurses 在其随附的文档中也有一些指示。

https://stackoverflow.com/questions/18900855/

相关文章:

linux - 在响应中返回某个字符后,如何关闭 netcat 连接?

linux - 有什么方法可以在linux中保留但不提交内存?

linux - 为什么 Linux 二进制文件的虚拟内存地址从 0x8048000 开始?

linux - 我在哪里可以找到 Unix 实用程序的源代码?

c - 32 位应用程序如何在 64 位 Linux 上进行系统调用?

linux - 当存在同名的共享库时,如何强制链接静态库

linux - 如何获取 linux 实用程序 tail 的源代码?

c - gcc 调试符号(-g 标志)与链接器的 -rdynamic 选项

linux - 内核熵池是如何工作的?

linux - Linux 上是否还存在 Thundering Herd 问题?