سؤال

وأود أن يكون متغير (أو #define) في مصدر C ++ التي من شأنها زيادة كل مرة يمكنني استخدام كيو تي الخالق لبناء شفرة المصدر. هل هناك أي طريقة أستطيع أن أفعل ذلك، وربما بعض المساعد كيو تي الخالق أو ما شابه ذلك؟ إذا كان هناك طريقة للقيام بذلك إذا كنت تستخدم "جعل" على سطر الأوامر لبناء؟

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

المحلول

في ملف .pro الخاص بك، يمكنك إنشاء متغير الذي يحتوي على نتائج برنامج سطر الأوامر. ثم يمكنك استخدام ذلك لإنشاء تحديد.

BUILDNO = $$(command_to_get_the_build_number)
DEFINES += BUILD=$${BUILDNO}

إذا كنت ترغب فقط في عدد تزايد بسيط، يمكنك استخدام برنامج نصي بسيط جدا:

#!/bin/bash
number=`cat build_number`
let number += 1
echo "$number" | tee build_number #<-- output and save the number back to file

وأود أن أشير إلى أن هذا من شأنه أن يؤدي إلى رقم البنية لزيادة كل مرة تقوم فيها بناء، وأيضا زيادة إذا حاولت بناء ولكنه فشل. وهناك طريقة أفضل هو الحصول على رقم البنية استنادا إلى حالة من رمز، والعديد من أدوات التحكم في الإصدار يمكن ان تحصل على سلسلة نصية لذلك، إن لم يكن العدد.

نصائح أخرى

وكما كتبت قبل بعد بعض التجارب وجدت أن الحل الأصلي لديه مشكلة منذ رقم الإصدار لا يتم تحديث كل مرة يتم بناء جديدة. في الكثير من الحالات كنت قد تحرير ملف مصدر، تشغيل بناء، ولكن لا يزال لديه نفس بناء عدد ... عملية بناء قررت فقط أن لا شيء تغير وتخطي الخطوة التي من شأنها أن قمنا بتحديث رقم البنية. أنا أول محاولة لايجاد وسيلة لإجبار تلك الخطوة، ولكن لم أستطع ذلك. وأخيرا قررت أن أذهب بطريقة مختلفة. الآن يمكنني استخدام البرنامج النصي لإنشاء ملف رأس build_number.h الذي يحتوي على #define BUILD مع عدد تحديثها وراء. حتى Calebs النصي الآن قليلا تعديل (build_number.sh):

#!/bin/bash
number=`cat build_number`
let number++
echo "$number" | tee build_number #<-- output and save the number back to file
echo "#define BUILD ""$number" | tee ../MyProject/build_number.h

ومازال تخزين عدد تزايد في ملف يسمى build_number. كان يمكن أن تجنب ملف ثالث عن طريق تحليل ولدت رأس ملف لعدد، لكنها قررت ضدها. لاحظ أن السيناريو ورأس لدت تقع في الدليل المشاريع في حين أن ملف build_number في الدليل بناء. هذا ليس مثاليا، ولكن أستطيع العيش معها.

في أجل وضع الأشياء معا هناك الآن بعض أكثر الأشياء للقيام به. أولا رأس الملفات التي تم إنشاؤها لا بد من إضافتها إلى المشروع في مصمم كيو تي ... انقر بزر الماوس الأيمن على رأس-الملفات و"إضافة ملف موجود". ثانيا، لا بد من إدراجها في C ++ - ملف حيث BUILD تحديد داخل الوصول ... #include "build_number.h" ... وأخيرا وليس آخرا بعض الإضافات يجب أن تتم على ملف المشروع (MyProject.pro). علما بأنني حذف الاشياء من حل Calebs، لذلك علينا أن نبدأ من الصفر هنا:

build_nr.commands = ../MyProject/build_number.sh
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr

وهذه الخطوط (أنا وضعت لهم قبل قسم HEADERS) إجبار تنفيذ البرنامج النصي، الذي يقرأ الماضي بناء عدد من build_number، الزيادات ذلك، يكتب مرة أخرى، وكذلك يولد نسخة محدثة من ملف build_number.h. ومنذ ذلك جزء من مصدر مشروع يحصل على قيمة جديدة مرتبطة إلى رمز في كل مرة.

وهناك شيء واحد أن أذكر - الآن عملية البناء هو <م> لا في الرأي القائل بأن شيئا لم يتغير. وذلك حتى إذا ترك دون تغيير التعليمات البرمجية سوف تشغيل جديد جعل توليد رقم الإصدار الجديد وبناء ثنائي جديد. غادر الحل القديم الرقم عند تغير رمز، وهذا الحل الجديد يجبر بناء جديدة حتى عندما يكون المصدر هو دون تغيير، منذ أن فرض تغيير في هذا الملف رأس واحد. كان المرء يفضل شيء بين بين ولكن منذ الرأس يتم تضمين فقط في مكان واحد لإعادة بناء سريع جدا ولا يضر ذلك بكثير. ولكن لا يزال، اذا كان شخص يعرف كيفية الحصول على أفضل ما في العالمين يرجى تقديم المشورة. على الأقل أنا الآن سوف يكن لديك اثنين من ثنائيات مختلفة مع نفس رقم الإصدار.

وأي ما يعادل ويندوز لتحسين https://stackoverflow.com/a/5967447/1619432 :

و.pro:

build_nr.commands = build_inc.bat
build_nr.depends = FORCE
QMAKE_EXTRA_TARGETS += build_nr
PRE_TARGETDEPS += build_nr

HEADERS  += build.h

وbuild_inc.bat:

@echo off 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt
echo #define BUILD %var% >build.h
echo %var%
<ع> الاستخدام

#include "build.h"
...
qDebug() << "Build number:" << BUILD;

واقتراح كالب كبيرة، ولكن لم تنجح "من خارج منطقة الجزاء" في حالتي. حصلت بعض الأخطاء بدلا من ذلك واستغرق الأمر بعض القراءة لمعالجتها. التغييرات طفيفة جدا. كنت تستخدم كيو تي 4.7 على أوبونتو لينكس ... التغيير الأول، إذا كنت أستطيع أن أصدق ذلك، كان في شيل للانتقال من let number += 1 إلى let number++ ... وعادة ما تستخدم / برنامج Windoze، لذلك لا أستطيع أن أشرح ذلك، ولكن عند تشغيل البرنامج النصي من سطر الأوامر (شل موجه) في الدعوى الأصلية أحصل ذكرت أخطاء، في حالة تغير سارت الامور بشكل جيد ويتم إرجاع الأرقام تزايد ...

ومنذ ليست ذكرت تماما من قبل كاليب - اعتدت build_number.sh كاسم للشيل وجعل ملف آخر مع build_number اسم (بدون .sh) وضعت للتو صفر في الداخل، أي شيء آخر

وكانت ثابتة علة الماضي، وأبشع من خلال استبدال BUILDNO = $$(command_to_get_the_build_number) مع BUILDNO = $$system(./build_number.sh) في ملف مشروع كيو تي. لاحظ system بعد $$ و./ المطلوبة أمام اسم الملف. في وقت لاحق من الابتدائي لينكس للمستخدم العادي، ولكن ليس كثيرا لمستخدم ويندوز.

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

وأوه، كلمة أخيرة ... وأود أيضا أن تغيير DEFINES += -DBUILD=$${BUILDNO} إلى DEFINES += BUILD=$${BUILDNO}، لذلك ذهب -D. داخل التعليمات البرمجية C ++ ستستخدم BUILD كما #define BUILD 1234 إذا كنت قد كتبت في الجزء العلوي من الملف.

وهنا حل لWin7 وخطرت لي على أساس في حل . كما يجعل هذا الحل ويندوز إعطاء YER نسخة # عند النقر بزر الماوس الأيمن فوق الهدف ريال يمني، واختر خصائص | تفاصيل. وهو يعمل في Win7 و، وربما الأكثر الإصدارات السابقة.

وطيب، وجعل لكم YER build_inc.bat:

@echo off
copy /b myapp.rc +,,
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt
echo #define BUILD %var% >build.h

وووضعها في مجلد مسقطة ريال يمني. (copy /b myapp.rc +,, هو غامض مايكروسوفت الإرشادي ل "لمسة" - لتحديث الوقت الطوابع على الملف) وحتى الآن، جيد جدا - ماذا في ذلك !!

وهذا الجزء هو اختياري، إذا لم يكن في حاجة إلى إصدار المشفرة في ثنائي. إنشاء الملف .rc، منها مثلا:

#include "build.h"

1 VERSIONINFO
FILEFLAGS 32
FILEVERSION 1, 0, BUILD, 0
PRODUCTVERSION 1, 0, BUILD, 0
FILEOS 4
FILETYPE 1

{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904B0"
        {
            VALUE "FileDescription", "program"
            VALUE "OriginalFilename", "program.exe"
            VALUE "CompanyName", "you"
            VALUE "FileVersion", "Release"
            VALUE "LegalCopyright", "Copyright (c) 2016, you, fool!"
            VALUE "ProductName", "Yer proggie"
            VALUE "ProductVersion", "Release"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x0409, 0x04B0
    }
}

وهناك نسخة أكثر كاملة متاحة هنا: الإصدار دلس . راجع للشغل: لن تعمل من دون كتلة VarFileInfo. ويستخدم هذا .RC للأشياء مثل النقر بزر الماوس الأيمن والحصول على هذه المعلومات في خصائص | تفاصيل. لدي كل ملف M $ .RC لهذه المعلومات ورمز التطبيق، وإضافة موارد أخرى في كيو تي الخالق تحت الموارد.

وليس اختياري لذلك: وهنا يكمن جزء قضيت بعض الوقت للعثور على القرصنة. في كيو تي الخالق، مع YER مسقطة فتح، انقر فوق رمز جهاز الكمبيوتر الصغير ووضعها في وضع الإصدار. انقر على "مشاريع". انقر على "أضف الخطوة بناء"، اختر مخصص خطوة عملية، وانقر على أيقونة قبعة "^" حتى يصبح في أعلى القائمة. نقول لكم لقد اسمه YER .RC، "myapp.rc". جعل ثا الخطوة بناء على ما يلي:

Command: cmd.exe
Arguments:/c build_inc.bat
Working Directory: %{CurrentProject:Path}

وعلى الرغم من إصدار المستندة كماكي قد تعمل بشكل جيد من سطر الأوامر أو أدوات سطر الأوامر تسمى من IDE، في كيو تي الخالق، خطوات بناء هي الأفضل، على ما أعتقد. كيو تي الخالق لا يعمل في الواقع كماكي لكل بناء؛ ولكن بناء الخطوات يتم تشغيل كل بناء.

والآن، هذا إضافة إلى ملف .pro YER:

RC_FILE +=  myapp.rc

وأيضا، إضافة إلى myapp.rc YER مسقطة. انها سوف تظهر تحت عنوان "ملفات أخرى".

والآن إعادة بناء. كل بناء من شأنه أن يؤدي لمسة من ملف المورد، وبالتالي تشغيل "الصليب الأحمر" في كل مرة. خلاف ذلك، لن تحصل على ترميز رقم البنية في حق ثنائي. تشغيله بسرعة بالنسبة لي. كل بناء وزيادة هذا العدد. لقد ازعجت فقط لإضافتها إلى "يطلق" بناء. حتى يبني التصحيح لا زيادة هذا. أنها سوف مجرد استخدام عدد من بناء الماضي. سوف تحتاج إلى تشغيله مرة واحدة في إطلاق لتجنب الخطأ، على ما أعتقد. هذا وتعمل دون منفصل بإعادة تشغيل كماكي في كل مرة في كيو تي الخالق؛ ويعطيك رقم بنية مختلفة في كل مرة. أنها لا تؤدي إلى أي recompiles أخرى. لديك النفقات العامة للتشغيل "الصليب الأحمر" وربط في كل مرة، في مقابل عدم القيام بأي شيء إذا كان كل شيء حتى الآن. لكن OTOH، أفعل ذلك من أجل إطلاق يبني فقط؛ كنت تقريبا تصل دائما لبناء أو تشغيل أي حال. ومرة أخرى، "الصليب الأحمر" هو سريع.

واختياري: يمكنك نقل رمز BUILD المعالج حيثما تريد في قيود التصدير الطوعية ريال يمني. #. (ملاحظة: يمكنك أيضا إضافة رمز التطبيق YER مع شيء من هذا القبيل:

IDI_ICON1 ICON DISCARDABLE "Icons/myicon.ico"

وهذا يجعل من تظهر في مستكشف حتى قبل أن يتم تشغيل الملف.)

ويمكنك أيضا إضافة "build.h" لمسقطة YER رسميا في كيو تي الخالق، إدراجه في الملف الذي تريد استخدام بناء # في، واستخدامه بمثابة سلسلة، على سبيل المثال مع:

#include <QDebug>
#include "build.h"

#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)

qDebug() << QString("(build ")+STR(BUILD)+")";

ولقد لاحظت وجود الآثار الجانبية: إذا كنت تفعل ذلك بهذه الطريقة، فإنه سيتم إعادة بناء قبل كل شوط في بيان. انا اعتقد ان هذا ليس سيئا للغاية الثمن الواجب دفعه. اعتقد انني يمكن نسخ دائما أوقات التشغيل إلى دليل الإصدار، وتشغيله من مستكشف. أو مجرد طرح مع الترجمة اضافية من بلدي about.h، وشوط من "الصليب الأحمر" وصلة مع كل تشغيل في الافراج عنهم. لهذه المسألة، ويمكنني أن مجرد خلق أداة خارجية لتشغيله مع اختصار لوحة المفاتيح. أنا بالتأكيد منفتحون على أي تحسينات في هذا الشأن. في الوقت الحاضر، وأنا لا يكلف نفسه عناء، ومجرد تجميع "about.cpp"، يعمل "الصليب الأحمر" وربط مع كل تشغيل لا تستغرق وقتا طويلا جدا. ومع ذلك، الناس: أرقام الإنشاء التلقائي

و☮!

وتحرير: اختياري: في سrder للحصول عليه لزيادة رقم البنية فقط عند بناء أو إعادة بناء المشروع الخاص بك، ولكن ليس عند تشغيله (على الرغم من بناء سيحدث دائما في الإصدار)، انتقل إلى مشاريع | بناء وتشغيل | تشغيل، انقر فوق "إضافة خطوة نشر" واختيار "عملية مخصص الخطوة":

Command: cmd.exe
Arguments: /c if exist build.old copy /y build.old build.txt
Working Directory: %{CurrentProject:Path}

وبعد ذلك، إضافة

copy /y build.txt build.old

وبعدecho إيقاف في ملف .bat. بل لعله من الممكن، على الرغم من المشاركة، لجعل قوالب المشاريع الجديدة مخصصة: توسيع دليل كيو تي الخالق

وتحرير: لقد أصبح الآن يعمل مع واحد، وليس اثنين، والعرف بناء خطوات

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