我正在为x86 ubuntu机器上的raspberry pi ARM目标编写一些代码。我正在使用gcc linaro armhf工具链。我能够在pi上交叉编译和运行一些独立的程序。现在,我想将我的代码链接到外部库,如ncurses。我怎样才能做到这一点
我是否应该将我的程序与主机上现有的ncurses库链接,然后在ARM上运行?(我认为这行不通)
我是否需要获取arm库的源代码或预构建版本,将其放在我的库路径中,然后进行编译
在这种情况下,最佳做法是什么
我还想知道它是如何为c stdlib工作的。在我的程序中,我使用了stdio函数,它在交叉编译后工作,没有做任何特殊的事情。我只是在makefile中为我的arm gcc提供了路径。所以,我想知道,它是如何得到正确的std头和lib的
关于你的一般性问题:
C库工作原理:
C库是交叉工具链的一部分。这就是为什么会找到标题,程序会正确链接并运行。对于其他一些非常基本的系统库,如libm和libstdc++,也是如此(并非在所有情况下,都取决于工具链配置)
通常,在处理交叉开发时,您需要某种方法来交叉编译所需的库。在这种情况下使用二进制文件是非常罕见的。也就是说,特别是在ARM硬件上,因为有太多不同的配置,而且通常所有的东西都以不同的方式剥离。这就是为什么二进制文件在不同的设备和Linux配置之间不太兼容的原因
如果你在Raspberry Pi上运行Ubuntu,那么你有可能在互联网上甚至在Ubuntu apt存储库中找到合适的ncurses库。然而,典型的方法是使用您拥有的特定工具链交叉编译库
在许多复杂的库需要交叉编译的情况下,有一些解决方案可以使编译变得更简单,比如buildroot或ptxdist。这些程序为嵌入式设备构建完整的Linux内核和根文件系统
然而,在您的情况下,只要您只需要ncurses,您就可以自己编译源代码。您只需下载源代码,运行configure,同时使用--host选项指定工具链。--prefix选项将选择安装目录。在运行make和makeinstall之后,考虑到一切顺利,您将获得一组头文件和ARM编译库,供您的应用程序链接
关于交叉编译,你肯定会在互联网上找到大量的信息,也许ncurses在其附带的文档中也有一些提示