【问题标题】:Finding compiler vendor / version using qmake使用 qmake 查找编译器供应商/版本
【发布时间】:2010-10-22 12:35:31
【问题描述】:

有没有办法通过qmake获取用户使用的编译器的版本和厂商?我需要的是在使用 g++ 3.x 时禁用构建我的项目的一些目标,并在使用 g++ 4.x 时启用它们。

更新:大多数答案都针对预处理器。这是我想避免的事情。我不希望为特定编译器版本构建目标,我希望由构建系统做出此决定。

【问题讨论】:

    标签: c++ qt build-process makefile qmake


    【解决方案1】:

    除了ashcatch 的回答之外,qmake 还允许您使用query the command line 并将响应作为变量返回。所以你可以这样:

    linux-g++ {
        system( g++ --version | grep -e "\<4.[0-9]" ) {
            message( "g++ version 4.x found" )
            CONFIG += g++4
        }
        else system( g++ --version | grep -e "\<3.[0-9]" ) {
            message( "g++ version 3.x found" )
            CONFIG += g++3
        }
        else {
            error( "Unknown system/compiler configuration" )
        }
    }
    

    然后,当你想用它来指定目标时,你可以使用配置范围规则:

    SOURCES += blah blah2 blah3
    g++4: SOURCES += blah4 blah5
    

    【讨论】:

    • 非常感谢。我正在考虑做类似的事情,但我想我会问是否有开箱即用的东西。由于显然您的解决方案还没有准备好使用:-)
    • @Caleb:如果您使用 gcc -dumpversion 命令,可能会进行简化,这可能会使 grep 变得多余。我可以编辑你的答案还是再写一个?
    • @BogdanWilli 随意。
    【解决方案2】:

    我的回答基于Caleb Huitt - cjhuitt's。但他的方法对我不起作用。

    *-g++ {
        GCC_VERSION = $$system("g++ -dumpversion")
        contains(GCC_VERSION, 6.[0-9]) {
            message( "g++ version 6.x found" )
            CONFIG += g++6
        } else {
            contains(GCC_VERSION, 5.[0-9]) {
                message( "g++ version 5.x found" )
                CONFIG += g++5
            } else {
                contains(GCC_VERSION, 4.[0-9]) {
                    message( "g++ version 4.x found" )
                    CONFIG += g++4
                } else {
                    message( "Unknown GCC configuration" )
                }
            }
        }
    }
    

    如您所见,您可以从 GCC 获取版本,然后将其与正则表达式进行比较。

    使用方法同上:

    SOURCES += blah blah2 blah3
    g++4: SOURCES += blah4 blah5
    

    【讨论】:

    • +1 用于展示如何检查一次版本并存储结果。另请注意,$$QMAKE_CXX(例如)将返回当前编译器的全名,例如。如果交叉编译。 GCC_VERSION = $$system("$${QMAKE_CXX} -dumpversion")
    【解决方案3】:

    首先,我会看看 qmake 支持的作用域功能:

    Scopes and Conditions

    但是当我读到它时,似乎默认情况下您可以使用通用平台条件,如 win32unix,或者您可以使用 qmake 规范的名称,如 linux-g++。你可以像这样测试 Visual Studio 版本(因为不同的 Visual Studio 版本使用不同的 qmake 规范),但我不认为你可以像这样测试 gcc 版本(至少我不知道如何)。

    【讨论】:

      【解决方案4】:

      我的回答是基于dismine's answer
      我们可以简单地使用 $$str_member 提取主版本号

      gcc | clang {
          COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion")
          COMPILER_MAJOR_VERSION = $$str_member($$COMPILER_VERSION)
          greaterThan(COMPILER_MAJOR_VERSION, 3): message("gcc 4 or later")
          greaterThan(COMPILER_MAJOR_VERSION, 4): message("gcc 5 or later")
          greaterThan(COMPILER_MAJOR_VERSION, 5): message("gcc 6 or later")
          greaterThan(COMPILER_MAJOR_VERSION, 6): message("gcc 7 or later")
      }
      

      【讨论】:

      • 对于旧的 Qt 版本 str_member 不可用,但以下为我工作 COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion") COMPILER_MAJOR_VERSION1 = $$split(COMPILER_VERSION, ".") COMPILER_MAJOR_VERSION = $$first(COMPILER_MAJOR_VERSION1)
      【解决方案5】:

      我愿意

      isEmpty(MGWVER) {
          MGW_MAJ = $$system(echo | gcc -dM -E - | fgrep __GNUC__ | cut -d\" \" -f 3)
          MGW_MIN = $$system(echo | gcc -dM -E - | fgrep __GNUC_MINOR__ | cut -d\" \" -f 3)
          MGWVER =$$MGW_MAJ$$MGW_MIN
          message(MGWVER $$MGWVER)
      }
      

      它返回“48”。 我用它来链接适当的 boost 库:

      USER_BOOST_CFG=mgw$${MGWVER}-mt-s-$$(BOOST_VER)
      message($$USER_BOOST_CFG)
      LIBS *= -L$$(BOOST_ROOT)/lib
      LIBS *= -L$$(BOOST_ROOT)/stage/lib
      
      LIBS *= -lboost_system-$$USER_BOOST_CFG
      LIBS *= -lboost_filesystem-$$USER_BOOST_CFG
      LIBS *= -lboost_date_time-$$USER_BOOST_CFG
      

      有效地给予: -lboost_system-mgw48-mt-s-1_54

      我在 mingw。

      另一个想法是查看 QMAKESPEC 变量并从中解析,提示:

      message(QMAKESPEC $$QMAKESPEC)
      SPLITED=$$section(QMAKESPEC, "/", 0, -3)
      message(SPLITED $$SPLITED)
      

      【讨论】:

      • 这不适用于 Qt 5.4(所选套件:Desktop Qt 5.4.1 MinGW 32bit)fgrep 不可用。
      • fgrep 不是 qt 的一部分。你需要gnuwin32.sourceforge.net。我建议安装 chocolatey.org 而不是 'choco install gnuwin' 。来自命令行或脚本的一切
      【解决方案6】:

      每个编译器供应商都使用定义一些特定的符号来标识编译器和版本。您可以使用这些符号进行检查。

      例如,我知道 _MSC_VER 给出了 Microsoft C++ 编译器的版本。

      我还知道 Boost Libraries 使用这种特征选择和适应。

      您可以查看包含文件夹中的 Boost Config 标头,路径为: boost/config/* ,特别是 select_compiler_config.hpp。

      通过使用这些编译器特定的符号,您可以在构建代码的预处理阶段进行特征选择。

      【讨论】:

        【解决方案7】:

        以下宏是在我的gcc和g++版本中定义的

        #define __GNUC__ 4 
        #define __GNUC_MINOR__ 0
        #define __GNUC_PATCHLEVEL__ 1
        

        另外,g++ 定义:

        #define __GNUG__ 4
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-30
          • 1970-01-01
          • 1970-01-01
          • 2014-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多