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

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

我应该只是将我的程序与主机上现有的ncurses lib链接,然后在ARM上运行? (我不认为这会工作)我需要得到的源代码或预编译的ARM版本的版本,把它放在我的libpath,然后编译?

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

我也想知道它是如何工作的C stdlib。 在我的程序中,我使用了stdio函数,它在交叉编译之后没有做任何特别的工作。 我只是在makefile中为我的arm gcc提供了path。 所以,我想知道,它是如何得到正确的标题和库?

Solutions Collecting From Web of "交叉编译时如何使用外部库?"

关于您的一般问题:

为什么C库工作:

C库是你的交叉工具链的一部分。 这就是为什么找到标题和程序正确链接和运行。 对于一些其他非常基本的系统库(如libm和libstdc ++)也是如此(不是每种情况都取决于工具链配置)。

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

如果你在Raspberry Pi上运行Ubuntu,那么你有可能在互联网上甚至在一些Ubuntu apt版本库中找到合适的ncurses库。 但是,典型的方法是使用特定的工具链交叉编译库。

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

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

关于交叉编译,你肯定会在网上找到大量的信息,也许ncurses在它的文档中也有一些指针。

查询How the C library works in cross-tools

在配置期间编译和构建交叉工具链时,它们将提供sysroot。

--with-sysroot=${CLFS_CROSS_TOOLS}

--with-sysroot --with-sysroot=dir

Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.

因此,在查看/lib /usr/include ,它将在编译时查看/ Toolchain /(libc)和(包含文件)

你可以检查

arm-linux-gnueabihf-gcc -print-sysroot

这显示在哪里寻找libc。

arm-linux-gnueabihf-gcc -print-search-dirs

给你清晰的画面

显然,你将需要一个针对你所针对的ARM编译的ncurses ,主机上的那个将会对你没有任何好处(除非你的主机有一个ARM处理器 – 但你说的是x86,显然不是这种情况)。

可能有一些预构建的库,但我怀疑找到一个(工作和匹配你的具体条件)的工作要比从源头上构建库本身要多 – 我不应该那么辛苦,我希望ncurses不会花那么多分钟来建立。

至于你的第一个问题,如果你打算在你的交叉编译器工具链中使用ncurses库,你将会有它的arm-built的二进制文件。

你的第二个问题是它如何与标准库的工作,以及它不是系统libc / libm工具链用于编译/链接你的程序。 也许你会从编译器的–print-file-name =选项中看到它:

 arm-none-linux-gnuabi-gcc --print-file-name=libm.a ...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so ...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so 

我认为你的树莓工具链可能是一样的。 你可以试试这个。

Vinay的回答非常稳固。 在编译--sysroot=<dir> pi的ncurses库时,只需要进行更正,设置rootfs的选项是--sysroot=<dir>而不是--with-sysroot 。 那是我在使用下面的编译器时发现的:

 arm-linux-gnueabihf-gcc --version
 arm-linux-gnueabihf-gcc(crosstool-ng linaro-1.13.1 + bzr2650  -  Linaro GCC 2014.03)4.8.3 20140303(prerelease)
 Copyright(C)2013 Free Software Foundation,Inc.
这是免费软件; 请参阅复制条件的来源。 没有
保证; 甚至不适用于适销性或针对特定用途的适用性。