سؤال

هل هناك أي طريقة للحصول على نسخة من البائعين مترجم المستخدمة من قبل المستخدم من خلال qmake?ما أريده هو تعطيل بناء بعض الأهداف من المشروع عندما g++ 3.x يستخدم وتمكينها عندما g++ 4.x يستخدم.

تحديث: معظم الإجابات استهدفت المعالج.هذا هو الشيء الذي كنت تريد تجنب.أنا لا أريد هدف إلى بناء معين مترجم نسخة أريد هذا القرار خلال بناء نظام.

هل كانت مفيدة؟

المحلول

بالإضافة إلى ashcatch's الإجابة ، qmake يسمح لك الاستعلام عن سطر الأوامر والحصول على الرد مرة أخرى حسب متغير.حتى تستطيع أن شيئا من هذا القبيل:

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

نصائح أخرى

جوابي على أساس كالب 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" )
            }
        }
    }
}

كما ترى يمكنك الحصول على نسخة من دول مجلس التعاون الخليجي ومن ثم مقارنتها مع regex التعبير.

كيف السبيل إلى استخدام نفس:

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

في البداية أود أن ننظر في النطاق الميزة التي qmake يدعم:

نطاقات والشروط

ولكن حين قرأت عن ذلك ، يبدو أن افتراضيا يمكنك استخدام منصة العامة الشروط مثل win32 أو unix أو يمكنك استخدام اسم qmake المواصفات مثل linux-g++.يمكنك اختبار Visual Studio إصدار مثل هذا (منذ المختلفة Visual Studio إصدارات مختلفة qmake المواصفات), ولكن لا أعتقد أنه يمكنك اختبار دول مجلس التعاون الخليجي إصدار مثل هذا (على الأقل أنا لا أعرف كيف).

أنا لا

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".أنا استخدامها لربط السليم دفعة المكتبات:

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

أنا على مينغو.

فكرة أخرى هي أن ننظر إلى QMAKESPEC vaariable و تحليل من تلميح:

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

جوابي هو على أساس dismine الجواب
يمكننا ببساطة استخراج رقم الإصدار الرئيسي باستخدام $$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")
}

كل برنامج التحويل البرمجي المورد استخدامها لتحديد بعض الرموز التي تحدد مترجم و نسخة.هل يمكن جعل الاختيار استخدام هذه الرموز.

أنا أعرف مثلا أن _MSC_VER يعطي نسخة من Microsoft C++ Compiler.

ما أعرف أيضا أن تعزز المكتبات استخدام هذا النوع من ميزة الاختيار والتكيف.

يمكنك إلقاء نظرة على تعزيز التكوين رؤوس وجدت في تضمين مجلد في المسار:دفعة/config/* , خصيصا في select_compiler_config.hpp.

باستخدام تلك مترجم رموز محددة ، يمكنك جعل ميزة الاختيار في تجهيزها مرحلة بناء التعليمات البرمجية.

وحدات الماكرو التالية المحددة في نسختي من دول مجلس التعاون الخليجي و g++

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

أديتيونالي g++ يعرف:

#define __GNUG__ 4
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top