gpt4 book ai didi

c++ - 编译具有特定体系结构的 C 程序

转载 作者:IT老高 更新时间:2023-10-28 21:43:34 27 4
gpt4 key购买 nike

我最近在尝试在我的 Mac 上编译依赖于另一个库的开源库时遇到了一些问题,并且遇到了一些关于库架构不兼容的错误。有人可以解释为特定架构编译 C 程序背后的概念吗?我以前见过 -arch 编译器标志,也见过传递给它的值,例如 ppci386x86_64 我假设映射到 CPU“语言”,但我的理解到此为止。如果一个程序使用特定的架构,它加载的所有库是否也需要位于同一架构上?如何判断给定程序/进程在什么架构下运行?

最佳答案

Can somebody explain the concept behind compiling a C program for a specific architecture?

是的。这个想法是将C翻译成一系列本地机器指令,将程序编码成二进制形式。这里“架构”的意思是“指令集架构”,即指令是如何以二进制编码的。例如,每种架构都有自己的编码方式,用于将两个整数相加的指令。

编译成机器指令的原因是它们运行得非常非常快。

If one program uses a particular architecture, do all libraries that it loads need to be on the same architecture as well?

是的。 (有异常(exception),但很少见。)

How can I tell what architecture a given program/process is running under?

如果一个进程在你的硬件上运行,它运行在本地架构上,在 Unix 上你可以通过运行命令 uname -m 来发现它。 ,尽管对于人类读者来说,uname -a 的输出可能会提供更多信息。

如果您有可执行二进制文件或共享库(.so 文件),您可以使用 file 发现其架构。命令:

% file /lib/libm-2.10.2.so 
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

您可以看到这些二进制文件是为非常古老的 80386 架构编译的,尽管我的硬件是更现代的 i686。 i686 (Pentium Pro) 向后兼容 80386 并运行 80386 二进制文件以及 native 二进制文件。为了使这种向后兼容成为可能,英特尔付出了很多麻烦和代价——但他们实际上垄断了台式机 CPU 市场,所以这是值得的!

关于c++ - 编译具有特定体系结构的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2436755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com