机器类型(c++库):i386 vs x86_64
machine type (C++ librairies) : i386 vs x86_64
我对不同的机器架构(32位,64位,…)知之甚少。正因为如此,当我在不同的机器上使用c++库时,我经常遇到困难,被恼人的"未定义的体系结构符号"所困扰。
如果有人能向我解释为什么当我在同一台机器(一台使用了2年的mac和mountain Lion OS)上使用以下命令时,我会得到如此令人困惑的答案,我会非常高兴。.man uname
表示
-m打印硬件名称。
-p打印机器处理器架构名称。
- 乍一看,我会说-p更相关。所以我运行
uname -p
,得到:
i386(这意味着32位如果我没有错的话)。
- 然而,对于我在同一台机器上编译的库,运行
lipo -info lib_test.a
返回:输入文件lib_test。a不是fat文件
非fat文件:lib_test. exe。a是架构:x86_64(这意味着64位如果我没有错的话)
- 后者与
uname -m
的返回更一致。x86_64
这是Mac OS X的一个怪东西。所有的英特尔OS X硬件都是64位的,操作系统也是如此——然而,它可以强制运行在32位模式下。它能够执行64位和32位二进制文件,除非在32位模式下运行。
大多数二进制文件(。在此平台上交付的dylib和可执行文件是"fat"二进制文件,这意味着它们既包含32位英特尔二进制文件,也包含64位英特尔二进制文件,有时还将其他体系结构(Power PC)的二进制文件合并到一个文件中。系统将自动加载二进制文件中最合适的部分。
由于底层编译器通常需要在不同的体系结构下运行不同的标志来生成二进制文件,甚至平台#定义也不同,使得编译器在预处理后看到不同的源代码,因此二进制文件需要每个平台单独编译一次,然后使用lipo实用程序进行组合。XCode可以自动执行此过程。
虽然系统能够运行不同的二进制文件,包括32位和64位,但它们的执行模型是不同的,它们不能组合在同一个进程地址空间中。因此,如果一个库是64位的,而另一个库是32位的,则不能同时使用它们。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS 2013缺少符号(msvcr120.i386.pdb)
- 机器类型(c++库):i386 vs x86_64