file命令可识别静态库的归档格式及内部对象架构,如显示“ELF 64-bit”即为64位,“ELF 32-bit”即为32位;若仅显示“current ar archive”,需配合objdump -f进一步确认各.o成员的architecture字段。

用 file 命令直接看架构信息
Linux/macOS 下最直接的方法就是用系统自带的 file 命令,它能解析 ELF(Linux)或 Mach-O(macOS)文件头,准确识别目标平台和位宽。
操作很简单:
file libxxx.a
注意:静态库 libxxx.a 本质是多个 .o 文件的归档(ar 包),file 会显示归档格式本身,但通常也会附带内部对象文件的架构信息。如果输出里出现 ELF 64-bit LSB 或 Mach-O 64-bit,基本可确定是 64 位;出现 ELF 32-bit 或 Mach-O i386 就是 32 位。
常见干扰项:
立即学习“C++免费学习笔记(深入)”;
-
current ar archive这类描述只说明它是 ar 归档,不反映内部对象位数 - 某些 macOS 上的
file版本可能对 fat archive(多架构)支持有限,只报最外层信息
用 objdump -f 查看归档内每个 .o 的目标架构
当 file 输出模糊(比如只说 “ar archive”),或者你想确认所有成员是否统一架构,就得拆开看里面每个 .o。
objdump -f 能列出归档中每个成员的目标文件头,包括 architecture 字段:
objdump -f libxxx.a | grep architecture
你会看到类似:
archive member libxxx.a(foo.o) has architecture i386
archive member libxxx.a(bar.o) has architecture x86_64
这时候要注意:
- 如果混着
i386和x86_64,这个库是多架构混合的,链接时可能出错 - Windows 下没有
objdump,得换工具(见下一条) -
objdump来自 binutils,macOS 默认没装,需用brew install binutils
Windows 下用 dumpbin /headers 检查 .lib 中的对象
Windows 静态库是 COFF 格式,Visual Studio 自带的 dumpbin 是唯一可靠选择。
先解包查看成员(因为 .lib 也是归档):
dumpbin /linkermember:1 libxxx.lib
再对某个具体成员(如 xxx.obj)查头:
dumpbin /headers xxx.obj
关键看输出里 machine 行:
-
machine (x64)→ 64 位 -
machine (x86)→ 32 位 -
machine (ARM64)→ ARM64
注意:dumpbin /headers libxxx.lib 只会显示库本身的归档头,不反映内部对象,必须指定具体成员对象才有效。
为什么不能只看文件名或编译环境?
很多人以为 libxxx_x64.a 就一定是 64 位,或者“我在 64 位机器上编译的就肯定是 64 位”,这很危险。
真实情况是:
- 静态库可以跨平台交叉编译,文件名完全不可信
- 同一个构建系统(比如 CMake)可能同时生成 32/64 位版本,仅靠路径或变量名无法保证
- 链接时报
skipping incompatible libxxx.a或cannot find -lxxx,往往就是位数不匹配,但错误信息不会告诉你具体是哪边错了
所以,只要涉及多平台交付、CI 构建或混合链接(比如主工程 64 位,第三方库却是 32 位),必须实测验证,不能依赖命名或假设。


















