我最近正在尝试在Mac上编译一个开源库,这取决于另一个库,并且对于不兼容的库架构有一些错误.有人可以解释编译特定架构的C程序的概念吗?我已经看到了-arch编译器标志,并且已经看到传递给它的值,如ppc,i386和x86_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?
是. (存在异常,但很少见)
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,for GNU/Linux 2.6.8,stripped
您可以看到,这些二进制文件已经为旧的80386架构编译,即使我的硬件是更现代化的i686. i686(Pentium Pro)向后兼容80386,并运行80386二进制文件以及本地二进制文件.为了使这种向后兼容性成为可能,英特尔付出了很大的麻烦和费用,但是他们几乎在桌面cpu上占据了市场份额,所以值得!