【发布时间】:2018-06-28 05:40:52
【问题描述】:
我有一台 Mac Mini(运行 OS X 版本 10.11.6),我一直在尝试编译一个我想在 Travis-CI OS X 服务器上运行的二进制文件。
我之前已经成功地做到了这一点(使用相同的设备)。但是这一次,我收到了Illegal Instruction 4 错误,您可以在this line 上看到。我的 Mac Mini 上不会出现此错误。程序运行良好。它只发生在 Travis-CI 上。
对该错误的快速堆栈溢出搜索给了我this question,这表明可以通过使用-mmacosx-version-min=10.x 标志编译二进制文件来修复该错误。嗯,我试过没有用。更具体地说,我使用带有-mmacosx-version-min=10.9 标志的二进制文件进行编译,考虑到 Travis-CI OS X 版本是10.11,我认为应该没问题(这让我想知道为什么我首先会收到这个错误因为我在 OS X 10.11 上构建了二进制文件)。
我尝试运行的二进制文件可以找到here,如果我在上面运行otool -l,我会看到这个部分:
Load command 9
cmd LC_VERSION_MIN_MACOSX
cmdsize 16
version 10.9
sdk 10.11
看起来不错。我在 OS X 10.9 的兼容模式下编译并链接它,然后在 OS X 10.11 机器上编译它。动态依赖似乎也不错:
Mac-mini:~ patrick$ otool -L ./osx64-genXrdPattern
./osx64-genXrdPattern:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
这是我用来构建二进制文件的 g++ 版本:
Mac-mini:~ patrick$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
所以我花了很多时间试图弄清楚:为什么我的二进制文件不能在 Travis-CI 上运行?为什么我不断收到Illegal Instruction: 4?该二进制文件似乎在我的 Mac Mini 上运行良好。如果有人知道问题是什么或对解决问题有任何建议,将不胜感激。谢谢!
编辑:顺便说一下,这个二进制文件的代码可以在here 找到,我将它链接到objcryst 库。
Edit2:我尝试关闭编译器优化标志,看看优化是否发生了奇怪的事情。不过,即使关闭了编译器优化标志,我仍然得到相同的结果......
【问题讨论】:
标签: c++ travis-ci osx-elcapitan