我的问题与此处讨论的问题有关:
Is there a way that OpenMP can operate on Qt spanwed threads?
尝试在Mac OS下运行我的基于Qt的程序,在辅助线程中有一个OpenMP子句时,它崩溃了。浏览网页后,现在我明白这是由Apple提供的gcc相当旧版本(4.2)中的错误造成的。
然后我从http://hpc.sourceforge.net下载了最新的4.6版gcc,并尝试编译项目,但是我从g ++编译器得到了以下错误:
无法识别的选项'-arch' 无法识别的选项'-Xarch_x86_64'
我了解到这是因为这些是选项,只能由自定义配置的Apple-gcc编译器解释,而不能由标准gcc解释。
有人可以帮助我吗?我可以克服这个问题并配置g ++ 4.6与Qt一起使用以获得无错误的OpenMP支持吗?我承认我在Mac OS平台上是关于编译器和编程的新手,并希望从Visual Studio-Qt环境中移植我的代码。
非常感谢提前!
答案 0 :(得分:2)
如果你不害怕搞乱你的Qt安装,那么更改〜/ QtSDK / Desktop / Qt / 4.8.1 / gcc / mkspecs / common / g ++ - macx.conf中的QMAKE_CFLAGS_X86_64条目。
将'-Xarch_x86_64'替换为'-arch x86_64'。
答案 1 :(得分:1)
您可以使用非Apple gcc v4.6并为要构建的每个体系结构编译二进制文件(对于i386和x86_64,使用--target = $ {ARCH}应该没问题)。然后,一旦你为每个架构都有一个二进制文件,就像使用lipo一样:
lipo -create -arch i386 binary_32bit -arch x86_64 binary_64bit -output binary_universal
这将从binary_32bit和binary_64bit创建一个名为binary_universal的胖二进制文件(也称为通用二进制文件)。
或者您可以使用clang / llvm而不是gcc,它可能没有您描述的错误(如果通过Apple的开发人员工具提供)应该能够直接编译通用二进制文件。
答案 2 :(得分:0)
你应该运行qmake woth对应的-spec选项,例如,在freebsd上使用gcc46需要运行qmake所以: qmake --spec = freebsd -g ++ 46
答案 3 :(得分:0)
Lipo确实可以用来将多个目标文件放在一起形成一个“胖”对象文件,实际上事实证明这正是苹果公司的编译器所做的。他们的GCC编译器实际上是一个驱动程序,它将各种体系结构映射到适当的体系结构编译器,然后使用lipo将对象混合在一起。
请参阅:http://lists.macosforge.org/pipermail/macports-dev/2011-September/016210.html
以下是该驱动程序的源文件:
http://opensource.apple.com/source/gcc/gcc-5666.3/driverdriver.c
所有人都需要做的是获得一个新版本的GCC来支持-arch标志是修改这个驱动程序并让它指向你的gcc版本的脚本包装器,它为给定的体系结构添加了适当的标志,然后传递所有其余的参数。像这样:
#!/ bin / sh的
/opt/local/bin/gcc-mp-4.6 -m32 $ @
和
#!/ bin / sh的
/opt/local/bin/gcc-mp-4.6 -m64 $ @
这是一个链接,讨论如何做到这一点,并提供一个cmake项目,以便轻松获取GCC的macports版本,并支持两个英特尔架构的-arch标志:
http://thecoderslife.blogspot.com/2015/07/building-with-gcc-46-and-xcode-4.html