কিউমেক। প্রোগ্রামে বিভিন্ন ডিবাগ / রিলিজ আউটপুট ডিরেক্টরি কীভাবে নির্দিষ্ট করা যায়


106

আমার একটি কিউটি প্রকল্প রয়েছে এবং আমি উত্স গাছের বাইরে সংকলন ফাইলগুলি আউটপুট করতে চাই।

আমার বর্তমানে নিম্নলিখিত ডিরেক্টরি কাঠামো রয়েছে:

/
|_/build
|_/mylib
  |_/include
  |_/src
  |_/resources

কনফিগারেশনের উপর নির্ভর করে (ডিবাগ / রিলিজ), আমি বিল্ড / ডিবাগ বা বিল্ড / রিলিজ ডিরেক্টরিগুলির অধীনে বিল্ড ডিরেক্টরিটির ভিতরে থাকা ফাইলগুলি আউটপুট করতে চাই।

একটি .pro ফাইল ব্যবহার করে আমি কীভাবে এটি করতে পারি?


Qt অভ্যন্তরীণভাবে অভ্যন্তরীণভাবে ডিবাগ এবং রিলিজ তৈরির আচরণ করে যা সময়ের সাথে সাথে পরিবর্তিত হয়। সুতরাং আমরা আবিষ্কার করেছি যে পূর্ববর্তী সংস্করণগুলি ডিবাগ এবং রিলিজের মধ্যে পরবর্তী সংস্করণগুলিতে ভেঙে গেছে broke আমার সমাধান দেখুন যা এখন পর্যন্ত সমস্ত প্ল্যাটফর্ম এবং সমস্ত কিউটি সংস্করণে কাজ করে। stackoverflow.com/questions/32046181/...
adlag

2
যেহেতু এটি একটি পুরানো প্রশ্ন এটি উল্লেখ করা দরকার যে খুব কম ভোট সহ আরও ভাল উত্তর রয়েছে।
শে

উত্তর:


5

সংক্ষিপ্ত উত্তর: আপনি না

আপনি যে বিল্ড ডিরেক্টরিটি তৈরি করতে চান তার qmakeপরে চালানো উচিত makeSo সুতরাং, এটি একবার debugডিরেক্টরিতে একবার ডিরেক্টরিতে চালান release

এইভাবে আপনার প্রকল্পের বিল্ডিং কেউ কাজ এটা আশা হবে, এবং এর যে কিভাবে কিউটি নিজেই বিল্ড আপ সেট করা থাকে, যে কিভাবে কিউটি সৃষ্টিকর্তা আপনার আশা .proফাইল আচরণ করে: এটা শুধু শুরু হয় qmakeএবং তারপর makeআপনার টার্গেট এর মনোনীত কনফিগারেশনের জন্য বিল্ড ফোল্ডারে।

আপনি যদি এই ফোল্ডারগুলি তৈরি করতে চান এবং সেগুলির মধ্যে দুটি (বা আরও) বিল্ড সম্পাদনা করতে চান তবে আপনার একটি শীর্ষ স্তরের মেকফিলের প্রয়োজন হবে, সম্ভবত একটি শীর্ষ স্তরের প্রকল্প ফাইল থেকে তৈরি করা হবে Qmake এর মাধ্যমে।

দু'টির বেশি বিল্ড কনফিগারেশন থাকা অস্বাভাবিক নয়, সুতরাং আপনি কেবল একটি বিল্ড এবং রিলিজের মধ্যে পার্থক্য করার জন্য অহেতুক নিজেকে প্রতিশ্রুতিবদ্ধ করছেন; আপনার বিভিন্ন অপ্টিমাইজেশনের স্তরগুলি ইত্যাদির সাহায্যে বিল্ড থাকতে পারে deb


151

আমার কিউটি প্রকল্পের জন্য, আমি এই প্রকল্পটি * .pro ফাইলটিতে ব্যবহার করি:

HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
           src/dialogs.cpp

Release:DESTDIR = release
Release:OBJECTS_DIR = release/.obj
Release:MOC_DIR = release/.moc
Release:RCC_DIR = release/.rcc
Release:UI_DIR = release/.ui

Debug:DESTDIR = debug
Debug:OBJECTS_DIR = debug/.obj
Debug:MOC_DIR = debug/.moc
Debug:RCC_DIR = debug/.rcc
Debug:UI_DIR = debug/.ui

এটি সহজ, তবে দুর্দান্ত! :)


18
ঠিক যেটা আমার দরকার ছিল! আর মনে রাখবেন: কিছু এমনকি প্রায় স্যুইচ করতে সহজ করতে, শুধুমাত্র আপনার সংজ্ঞায়িত DESTDIRশর্তসাপেক্ষে গুলি, এবং তারপর আপনার সব অন্যান্য মার্গে যে মান ব্যবহার করুন: OBJECTS_DIR = $${DESTDIR}/.obj। চিয়ার্স!
জাভিয়ার হল্ট

4
এটি কীভাবে ব্যবহার করা হয় / কী করে তা ব্যাখ্যা করে মন? এটি প্রয়োগ করার পরে এর কোনও প্রভাব নেই বলে মনে হচ্ছে। সম্পাদনা করুন: যদি আমি ডিবাগকে ডিবাগ-এ পরিবর্তন করি (লোয়ার কেস) এটি কাজ করে। আমি সন্দেহ করি এটি উইন্ডো বনাম ইউনিক্স কেস সংবেদনশীল জিনিস।
notlesh

9
আমি এটি ভোট দিয়েছি কারণ এটি উইন্ডোজে কাজ করে। লিনাক্সে (উবুন্টু 15.04, কিউটি 5.5.0) আমাকে Debugযেতে debugএবং Releaseযেতে হয়েছিল release
জেপেসন

WTH? প্লাটফর্ম পেরিয়ে এত কিছু? @Jepessen ??
নীল

2
এটি কেবল তখনই কার্যকর হয় যখন আপনি কেবল কনফিগ-এ মুক্তি বা ডিবাগ করেন। যদি উভয়ই কনফিগারেশনে থাকে তবে দ্বিতীয়টি ব্যবহার করা হবে।
উইজকা

52

লক্ষ্য dll / উদাহরণের জন্য ডিরেক্টরিটি পরিবর্তন করতে, এটি আপনার প্রো ফাইলটিতে ব্যবহার করুন:

CONFIG(debug, debug|release) {
    DESTDIR = build/debug
} else {
    DESTDIR = build/release
}

আপনি অন্য বিল্ড টার্গেটের মতো অবজেক্ট ফাইল এবং মক ফাইলের জন্য ডিরেক্টরিগুলিও পরিবর্তন করতে চাইতে পারেন ( বিশদর জন্য Qmake ভেরিয়েবল রেফারেন্সটি পরীক্ষা করুন বা qmake CONFIG () ফাংশন রেফারেন্স )।


5
তবে আমি এতে $$ OUT_PWD অন্তর্ভুক্ত করা খুব ভাল পেয়েছি, তাই DESTDIR = $$ OUT_PWD / ডিবাগ
Ivo

1
@ আইভো: আহ! ধন্যবাদ! আমি সর্বত্র খুঁজছিলাম যা ভেরিয়েবলের সেই পথটিতে রয়েছে! : ডি
ক্যামেরন

1
এর পরে, আপনি লাইনগুলি যুক্ত করতে পারেন: OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui CONFIG()ব্যবহারের কিছু সমস্যার সমাধান করতে দেখা দেয় release:এবংdebug:
কারসন আইপি

এইটি নির্বাচিত উত্তরের চেয়ে ভাল কাজ করেছে। নির্বাচিত একটি কাজ করে তবে ডিবাগ এবং রিলিজ উভয়ই কনফিগার করা থাকলে সেটিংসের দ্বিতীয় ব্লকটি রয়ে যায়।
পাওলো কারওয়ালহো

42

আমার আরও কমপ্যাক্ট পদ্ধতি রয়েছে:

release: DESTDIR = build/release
debug:   DESTDIR = build/debug

OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui

2
আপনার উত্তরটি পৃথক ডিরেক্টরিতে সংকলক বিল্ড আউটপুট রাখার আরও সাম্প্রতিক উপায়।
SIFE

1
আপনি কি সম্প্রতি ডিবাগ এবং প্রকাশের জন্য এটি চেষ্টা করেছেন? আমার বিল্ড আউটপুটটি সর্বদা রিলিজ ফোল্ডারে শেষ হবে বলে মনে হচ্ছে, কোন কনফিগারেশনই নয়; আপনি এই উত্তরটি পোস্ট করার পরেও কিউমেক / কিউটি স্রষ্টার আচরণের পরিবর্তন হতে পারে ...
এসএসসি

1
রিলিজ মোডে qmake এর অতিরিক্ত যুক্তিতে "CONFIG - = ডিবাগ" যুক্ত করার চেষ্টা করুন
হ্যালো ডাব্লু

17

এটি করার সঠিক উপায়টি হ'ল (ধন্যবাদ কিউটি সহায়তা দল):

CONFIG(debug, debug|release) {
    DESTDIR = build/debug
}
CONFIG(release, debug|release) {
    DESTDIR = build/release
}

OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.u

এখানে আরও তথ্য: https://wiki.qt.io/Qt_proj__or_faq# কি_ডোস_সেন্টিচ্যাক্স_কনফিগ .২8debug.2Cdebug.7 ক্রাইলেজ .২৯_মেন_৩এফ_কি_ডো_স_স_স্টি_রগার্টমেন্ট_স্পেসিফাই_সেই_আপনি_তাই_তাই_ত_এই_সে?


13

আমি চালুপ দ্বারা প্রস্তাবিত একই পদ্ধতিটি ব্যবহার করি,

ParentDirectory = <your directory>

RCC_DIR = "$$ParentDirectory\Build\RCCFiles"
UI_DIR = "$$ParentDirectory\Build\UICFiles"
MOC_DIR = "$$ParentDirectory\Build\MOCFiles"
OBJECTS_DIR = "$$ParentDirectory\Build\ObjFiles"

CONFIG(debug, debug|release) { 
    DESTDIR = "$$ParentDirectory\debug"
}
CONFIG(release, debug|release) { 
    DESTDIR = "$$ParentDirectory\release"
}

12

পুরানো প্রশ্ন, তবে এখনও একটি আপ-টু-ডেট উত্তর worth ছায়া বিল্ডগুলি ব্যবহার করার সময় কিউটি ক্রিয়েটর যা করেন তা করা এখন সাধারণ বিষয় (নতুন প্রকল্প খোলার সময় এগুলি ডিফল্টরূপে সক্ষম করা হয়)।

প্রতিটি আলাদা বিল্ড টার্গেট এবং টাইপের qmakeজন্য ডানটি একটি ভিন্ন বিল্ড ডিরেক্টরিতে ডান যুক্তি দিয়ে চালানো হয়। তারপরে এটি কেবল সিম্পল দিয়ে নির্মিত make

সুতরাং, কাল্পনিক ডিরেক্টরি কাঠামো এটির মতো দেখাবে।

/
|_/build-mylib-qt5-mingw32-debug
|_/build-mylib-qt5-mingw32-release
|_/build-mylib-qt4-msvc2010-debug
|_/build-mylib-qt4-msvc2010-release
|_/build-mylib-qt5-arm-debug
|_/build-mylib-qt5-arm-release
|_/mylib
  |_/include
  |_/src
  |_/resources

এবং অপ্রয়োজনীয় জিনিসটি হ'ল, একটি qmakeবিল্ড ডিরেক্টরিতে চালিত হয়:

cd build-mylib-XXXX
/path/to/right/qmake ../mylib/mylib.pro CONFIG+=buildtype ...

তারপরে এটি বিল্ড ডিরেক্টরিতে মেকফাইলগুলি তৈরি করে এবং তারপরে makeএটিও ফাইল তৈরি করে। বিভিন্ন সংস্করণ মিশ্রিত হওয়ার ঝুঁকি নেই, যতক্ষণ না Qmake উত্স ডিরেক্টরিতে কখনও চালিত হয় না (যদি এটি হয় তবে এটি ভালভাবে পরিষ্কার করুন!)।

এবং যখন এটি করা হয়, .proবর্তমানে গৃহীত উত্তর থেকে ফাইলটি আরও সহজ:

HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
           src/dialogs.cpp

একটি একক প্রকল্পের জন্য সূক্ষ্মভাবে কাজ করে, তবে আপনার যদি কোনও প্রকল্প এবং একটি গ্রন্থাগার থাকে তবে কী হবে? তারপরে আপনার লাইব্রেরি আফিক্স অন্তর্ভুক্ত করার জন্য একটি বিল্ডটাইপ-নির্ভর উপায় দরকার।
অ্যাডভারস

@ অ্যাডভারসাস আমি নিশ্চিত না আপনি ঠিক কী বোঝাতে চাইছেন তবে সম্ভবত কিমেক ভেরিয়েবল $(OUT_PWD)সমাধান?
হাইড

আমি যখন আমার প্রশ্নটি আপনার উদাহরণটিতে প্রয়োগ করি তখন তা হয়ে যায়: অ্যাপ্লিকেশনটি গ্রহণের সর্বোত্তম উপায় mylibকী? আমি এটি চাই যদি এটি করার কোনও "করুণাময়" উপায় থাকে তবে আমি অন্যান্য উত্তরগুলির কৌশলগুলি ব্যবহারের বাইরে অন্য কোনও উপায় দেখতে পাচ্ছি না: LIBSস্মার্ট উপায়ে পূরণের জন্য বিল্ড টাইপ এবং কনফিগারেশন ব্যবহার করুন , বাতিল করুন ছায়া বিল্ড সুবিধা।
অ্যাডভারসাস

@ অ্যাডভারসাস যদি মাইলিব একই শীর্ষ স্তরের প্রকল্পের অধীনে সাবডির প্রকল্প হয় তবে আমি সাধারণত একটি mylib.pri ফাইল যুক্ত করব এবং অন্যান্য সাবডির প্রকল্পের প্রয়োজনীয় সমস্ত কিছু সেখানে রেখেছি, চতুষ্পদ নির্মাণের পরেও Qmake ভেরিয়েবলগুলি সর্বদা পাথ পেতে সক্ষম করে। তারপর অন্যান্য subdir .pro ফাইল কেবল হবেinclude(../mylib/mylib.pri)
হাইড

ধন্যবাদ, আমি এখন যা করছি সে ধরণের, এটির স্বয়ংক্রিয়ভাবে যত্ন নেওয়া এমন কোনও সমাধান পেয়ে ভালো লাগত, যেমন আপনি যখন চাঁদে সাবপ্রজেক্টের সাথে কোনও প্রকল্প করেন এবং সহজেই আলাদা করে তৈরি করতে পারেন- উত্স পুরো গাছের বিল্ডস।
অ্যাডভারস

3

আউটপুট এক্সিকিউটেবলের জন্য কিছুটা আলাদা নাম রাখাও এটি দরকারী। আপনি এর মতো কিছু ব্যবহার করতে পারবেন না:

release: Target = ProgramName
debug: Target = ProgramName_d

এটি কেন কাজ করে না তা পরিষ্কার নয় তবে তা হয় না। কিন্তু:

CONFIG(debug, debug|release) {
    TARGET = ProgramName
} else {
    TARGET = ProgramName_d
}

CONFIG +=লাইনটি এর আগে যতক্ষণ না এটি কাজ করে।


1

কিউটি ক্রিয়েটারের নতুন সংস্করণে ডিবাগ এবং রিলিজের মধ্যে একটি "প্রোফাইল" বিল্ড বিকল্প রয়েছে। এখানে আমি কীভাবে এটি সনাক্ত করছি:

CONFIG(debug, debug|release) {  DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else {                          DEFINES += RELEASE_MODE }

0

1. কনফিগে ডিবাগ / রিলিজ সন্ধান করুন

বর্তমান (ডিবাগ | প্রকাশ) পান।

specified_configs=$$find(CONFIG, "\b(debug|release)\b")
build_subdir=$$last(specified_configs)

(একাধিক হতে পারে, সুতরাং বিল্ডে কেবল সর্বশেষ নির্দিষ্ট করে রাখুন):

2. ডিস্টার্ড সেট করুন

এটিতে বিল্ড সাবডির নামটি ব্যবহার করুন

DESTDIR = $$PWD/build/$$build_subdir

0

এটি বিভিন্ন ডিবাগ / রিলিজ আউটপুট ডিরেক্টরিগুলির জন্য আমার মেকফাইল। এই মেকফিলটি উবুন্টু লিনাক্সে সফলভাবে পরীক্ষা করা হয়েছিল। উইন্ডোজে এটি নির্বিঘ্নে কাজ করা উচিত যে মিংডাব্লু-ডাব্লু 64 সঠিকভাবে ইনস্টল করা আছে।

ifeq ($(OS),Windows_NT)
    ObjExt=obj
    mkdir_CMD=mkdir
    rm_CMD=rmdir /S /Q
else
    ObjExt=o
    mkdir_CMD=mkdir -p
    rm_CMD=rm -rf
endif

CC     =gcc
CFLAGS =-Wall -ansi
LD     =gcc

OutRootDir=.
DebugDir  =Debug
ReleaseDir=Release


INSTDIR =./bin
INCLUDE =.

SrcFiles=$(wildcard *.c)
EXEC_main=myapp

OBJ_C_Debug   =$(patsubst %.c,  $(OutRootDir)/$(DebugDir)/%.$(ObjExt),$(SrcFiles))
OBJ_C_Release =$(patsubst %.c,  $(OutRootDir)/$(ReleaseDir)/%.$(ObjExt),$(SrcFiles))

.PHONY: Release Debug cleanDebug cleanRelease clean

# Target specific variables
release: CFLAGS += -O -DNDEBUG
debug:   CFLAGS += -g

################################################
#Callable Targets
release: $(OutRootDir)/$(ReleaseDir)/$(EXEC_main)
debug:   $(OutRootDir)/$(DebugDir)/$(EXEC_main)

cleanDebug:
    -$(rm_CMD) "$(OutRootDir)/$(DebugDir)"
    @echo cleanDebug done

cleanRelease:
    -$(rm_CMD) "$(OutRootDir)/$(ReleaseDir)"
    @echo cleanRelease done

clean: cleanDebug cleanRelease
################################################

# Pattern Rules
# Multiple targets cannot be used with pattern rules [https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html]
$(OutRootDir)/$(ReleaseDir)/%.$(ObjExt): %.c | $(OutRootDir)/$(ReleaseDir)
    $(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o"$@"

$(OutRootDir)/$(DebugDir)/%.$(ObjExt):   %.c | $(OutRootDir)/$(DebugDir)
    $(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o"$@"

# Create output directory
$(OutRootDir)/$(ReleaseDir) $(OutRootDir)/$(DebugDir) $(INSTDIR):
    -$(mkdir_CMD) $@

# Create the executable
# Multiple targets [https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html]
$(OutRootDir)/$(ReleaseDir)/$(EXEC_main): $(OBJ_C_Release)
$(OutRootDir)/$(DebugDir)/$(EXEC_main):   $(OBJ_C_Debug)
$(OutRootDir)/$(ReleaseDir)/$(EXEC_main) $(OutRootDir)/$(DebugDir)/$(EXEC_main):
    $(LD) $^ -o$@
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.