检查linux下编译的是哪个库

检查linux下编译的是哪个库

我想用 , 编译一个 C 文件gcc到运行 Gnu/Linux 的嵌入式arm。

我如何知道需要静态编译哪些函数/头文件,以及动态编译哪些函数/头文件?(我不想静态编译所有头文件)

有什么我可以使用的命令吗?

例如我 include stdio.hto use printf,有什么办法知道我是否必须静态编译它?

答案1

您需要知道哪些动态库在您的目标系统上可用,哪些不可用。

例如,在我的系统上stdio.h是package的包含文件之一libc6-dev(Debian包命名约定),对应的动态库libc.so.6libc-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。

相关内容