我想用 , 编译一个 C 文件gcc
到运行 Gnu/Linux 的嵌入式arm。
我如何知道需要静态编译哪些函数/头文件,以及动态编译哪些函数/头文件?(我不想静态编译所有头文件)
有什么我可以使用的命令吗?
例如我 include stdio.h
to use printf
,有什么办法知道我是否必须静态编译它?
答案1
您需要知道哪些动态库在您的目标系统上可用,哪些不可用。
例如,在我的系统上stdio.h
是package的包含文件之一libc6-dev
(Debian包命名约定),对应的动态库libc.so.6
是libc-2.24.so
.这是 GNU C 库,它是几乎所有程序的基本构建块,因此对于您的 ARM 系统来说,没有它(或它的某些等效项)作为动态库是很不寻常的:因为它是如此普遍使用过并且相当大,将其作为动态库非常有意义。
(此外,GNU C 库本身使用动态链接来实现可配置名称解析函数等功能:/etc/nsswitch.conf
告诉 C 库libnss_*.so
在运行时加载哪些库,因此将 GNU C 库完全静态地链接到程序将异常棘手。)
如果您的嵌入式 ARM 系统上没有lib*.so
安装特定库的特定文件,并且您仍然希望在程序中使用该库,则必须静态链接该库。为了在交叉编译的情况下做到这一点,你必须有相应的ARM版本lib*.a
该库的文件在您正在交叉编译程序的系统上。
尽管库的头文件 ( *.h
) 对于可编译该库的所有体系结构来说很可能是相同的,但*.so
和*.a
文件则不然:因为*.so
和*.a
文件都包含可执行代码,因此它们是特定于每个处理器体系结构的。因此,如果您在 x86_64 系统上为 ARM 进行交叉编译,则某些库lib*.a
文件的 x86_64 版本可用将不允许您使用静态编译的库来交叉编译 ARM 程序:您将需要lib*.a
该库的 ARM。