如何在OS X 10.9上编译c++程序并在以前的OS X版本上使用
How to compile a C++ program on OS X 10.9 and be used on previous versions of OS X?
我在OS X 10.9上写了一个c++程序,我想发布可执行文件,但是这个程序不能在OS X 10.7上运行。我得到错误信息Illegal instruction: 4
。有没有办法在OS X 10.9上编译我的程序,并使它在以前的OS X版本上工作,比如10.6或更高版本?我不使用Xcode,我使用clang++ 3.4版本与OpenMP支持(http://clang-omp.github.io)。作为附带说明,我还希望将OpenMP库与我的程序一起分发,以便用户不必自己安装它。如何使库与旧版本的OS X一起工作?
注意:当我在编译期间使用-mmacosx-version-min=10.6
时,我会得到几个与"未定义的符号用于架构x86_64"相关的错误。例如,在这个非常简单的程序中:
#include <iostream>
int main()
{
std::cout << "Hello, world!n";
return 0;
}
编译为clang++ -o hello hello.cc -mmacosx-version-min=10.6
,我得到以下错误:
Undefined symbols for architecture x86_64:
"__ZNKSt3__16locale9use_facetERNS0_2idE", referenced from:
__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m in hello-323147.o
"__ZNKSt3__18ios_base6getlocEv", referenced from:
__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m in hello-323147.o
"__ZNSt3__14coutE", referenced from:
_main in hello-323147.o
"__ZNSt3__15ctypeIcE2idE", referenced from:
__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m in hello-323147.o
"__ZNSt3__16localeD1Ev", referenced from:
__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m in hello-323147.o
"__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv", referenced from:
__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m in hello-323147.o
__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv in hello-323147.o
"__ZNSt3__18ios_base5clearEj", referenced from:
__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m in hello-323147.o
__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD2Ev in hello-323147.o
__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv in hello-323147.o
ld: symbol(s) not found for architecture x86_64
clang-3.4: error: linker command failed with exit code 1 (use -v to see invocation)
根据你问题的日期,我猜这是某个特定clang版本中的某种bug。我试过用Xcode 6.4编译你的例子,它编译和链接很好:
$ clang++ -o hello hello.cc -mmacosx-version-min=10.6
$ ./hello
Hello, world!
$ clang++ -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
不要在旧的osx机器上测试它,只要在Yosemite上运行就可以了。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 在 c++ 中检查 Windows OS 服务器版本
- 如何在Mac OS的发布版本中包含Qt库?
- 在Mac OS X Mountain Lion(或更高版本)和Linux上使用X11/Xlib.h
- QT 5.12 Mac OS X版本号码错误
- 从Win32 API C 获取OS构建版本
- 无法在Xcode版本4.3.2的Mac OS X Lion 10.7.5上运行Matlab Mex文件
- Mac OS X上的GLSL版本130导致错误
- OS X 上的 OpenGL 版本支持
- svn - OS x 上的 Qt Creator 版本错误
- ACE 在 MAC OS X 10.9(及更高版本)中的 Linker 上失败
- 尝试调试c++程序在Eclipse Mars上的MAC Pro视网膜与OS X Yosemite版本10.10.5
- 在OS X上更改Qt 4.8.6中QGLWidgets的OpenGL上下文版本
- 如何在OS X 10.9上编译c++程序并在以前的OS X版本上使用
- 在OS X(不同版本/配置文件)上的OpenGL上下文之间共享数据