【问题标题】:How a recent version of GCC (4.6) could be used together with Qt under Mac OS?最新版本的 GCC (4.6) 如何在 Mac OS 下与 Qt 一起使用?
【发布时间】:2011-09-09 07:36:40
【问题描述】:

我的问题与这里讨论的问题有关:

Is there a way that OpenMP can operate on Qt spanwed threads?

在尝试在 Mac OS 下运行我的基于 Qt 的程序时,它在辅助线程中有一个 OpenMP 子句,它崩溃了。浏览网页后,现在我了解到这是由 Apple 提供的较旧版本 (4.2) 的 gcc 中的错误引起的。

然后我从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 环境中移植我的代码。

非常感谢!

【问题讨论】:

  • 你能不能再给我们一点,比如你的配置命令……再多几行错误?
  • 嗯,这几乎就是我得到的所有内容,2 个无法识别的选项错误和另一个:'x86-64' 没有这样的文件或目录。这是在尝试编译项目时。我没有使用“配置”,只是在 Qt Creator 的构建设置下创建了一个配置文件以使用 GCC 4.6。使用 Apple-GCC 编译器可以很好地编译。我需要通过 GCC 4.6 编译 Qt 本身吗?
  • -arch 应该在 darwin 的 vanilla GCC 4.6 中,它已记录在案。至于错误,您是否尝试从 qt 构建设置中删除 arch 选项,编译器应该推断出正确的值。
  • 这些错误看起来像是来自编译管道的几个不同部分的错误。如果没有脚本中的实际文本,包括记录错误的二进制文件和记录错误以响应的命令行,任何人都很难进一步帮助您。请在您的问题中提供适当的成绩单摘录。将整个脚本(包括您的环境、目录布局和任何配置文件)发布到感兴趣的读者可以查看的异地位置也无妨,但可能有点矫枉过正。

标签: qt macos gcc openmp


【解决方案1】:

如果您不怕弄乱您的 Qt 安装,请更改 ~/QtSDK/Desktop/Qt/4.8.1/gcc/mkspecs/common/g++-macx.conf 中的 QMAKE_CFLAGS_X86_64 条目。

将“-Xarch_x86_64”替换为“-arch x86_64”。

【讨论】:

    【解决方案2】:

    您可以使用非 Apple gcc v4.6 并为您要构建的每个架构编译一个二进制文件(使用 --target=${ARCH} 对于 i386 和 x86_64 应该没问题)。然后,一旦你为每个架构都有一个二进制文件,就可以像这样使用 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 的开发人员工具提供)应该能够直接编译通用二进制文件。

    【讨论】:

    • 这里的问题是clang和llvm-gcc不支持
    • 我在某处读到 llvm-gcc 支持 OpenMP(不知道,因为我不使用它),可能在某处的 release notes 中。抱歉,有轻微的遗漏信息。
    • 哇,对不起,我不是故意发表评论的。确实如此,但它也基于 GCC 4.2,因此它可能会有相同的错误。 Dragonegg 可能会这样做,但由于它使用 FSF GCC,它可能会遇到同样的问题。
    • 很有可能它有错误,但是由于 llvm 进行代码生成并且 gcc 4.2 仅用于前端编译,我希望错误不会成为问题。另外,我修正了我的帖子中的一个错字(从唇到唇)。
    【解决方案3】:

    你应该运行带有相应 -spec 选项的 qmake,例如,要在 freebsd 上使用 gcc46,就需要运行 qmake,所以: qmake --spec=freebsd-g++46

    【讨论】:

      【解决方案4】:

      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 项目来轻松修复 macports 版本的 GCC 并支持两种英特尔架构的 -arch 标志:

      http://thecoderslife.blogspot.com/2015/07/building-with-gcc-46-and-xcode-4.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-30
        • 2011-01-02
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2016-05-09
        • 2015-04-17
        相关资源
        最近更新 更多