میک فائل نحو کو سمجھنا: عام مسائل اور حل (بشمول 'مسنگ آپریٹر' اور 'انٹری پوائنٹ نہیں ملا')

Myk Fayl Nhw Kw Smj Na Am Msayl Awr Hl Bshmwl Msng Apry R Awr An Ry Pwayn N Y Mla



جس طرح ایک کوڈ فائل میں کوڈ کی ایک یا زیادہ لائنیں بطور مواد ہوتی ہیں تاکہ اسے کارآمد بنایا جا سکے، اسی طرح بنیادی میک فائل کو متغیرات، اصولوں اور اہداف کا استعمال کرتے ہوئے بنایا جاتا ہے۔ اس کے علاوہ، دیگر عوامل بھی ہیں جو بغیر کسی مسئلے کے مکمل میک فائل بنانے کے لیے ضروری ہیں۔ اس گائیڈ میں، ہم میک فائل لکھتے وقت بنیادی میک فائل نحو اور عام مسائل پر بات کریں گے اور ان مسائل کو حل کرنے کے لیے حل فراہم کریں گے۔

Makefile بنیادی نحو کو سمجھنا

میک فائل کی تخلیق کے ساتھ شروع کرنے کے لیے، ہم میک فائل کوڈ کی مثال کے ذریعے میک فائل کی بنیادی خصوصیات کی وضاحت کرتے ہیں۔ قابل عمل فائل حاصل کرنے کے لیے میک فائل کے مواد میں درج ذیل نحوی خصوصیات کو شامل کرنا ضروری ہے۔







متغیر s: ایک بنیادی ڈیٹا ذخیرہ کرنے والی اشیاء جو میک فائل میں استعمال کرنے کے لیے ضروری ہیں۔ ان متغیرات کا استعمال کمپائلر، جھنڈوں، سورس فائلوں، آبجیکٹ فائلوں اور ٹارگٹ فائلز کی وضاحت کے لیے کیا جاتا ہے۔ مندرجہ ذیل سیمپل میک فائل کے اندر، کل پانچ متغیرات ہیں جو کہ CXX (C++ کمپائلر سیٹ کرنے کے لیے)، CXXFLAGSc (کمپیلر فلیگز)، TARGET (ٹارگٹ ایگزیکیوٹیبل فائل کا نام سیٹ کرنے کے لیے)، SRCS (ذریعہ کوڈ فائل سیٹ کرنے کے لیے) , OBJS (آبجیکٹ فائلوں کو رکھنے کے لیے جو سورس کوڈ فائل کے ذریعے تیار کی جاتی ہیں)۔



اہداف: ماخذ سے تعمیر کرنے کے لیے ایک متوقع آؤٹ پٹ۔ یہ ٹارگٹ فائل یا کوئی علامتی نام ہو سکتا ہے: 'سب' پہلے سے طے شدہ ہدف ہے جسے 'ٹارگٹ' متغیر کے ذریعے بنایا جانا چاہیے، '$TARGET' 'OBJS' متغیرات پر منحصر ہے، اور 'کلین' ہدف ہدف کو ہٹاتا ہے اور ورکنگ ڈائرکٹری سے آبجیکٹ فائلیں۔



قواعد و ضوابط کی تعمیر: سورس فائل یا انحصار سے ہدف بنانے کے لیے بنیادی ہدایات کا سیٹ۔ مثال کے طور پر، اصول '%.o: %.cpp' ظاہر کرتا ہے کہ 'cpp' ایکسٹینشن والی فائل کو 'o' ایکسٹینشن کے ساتھ ایک آبجیکٹ فائل بنانے کے لیے استعمال کیا جاتا ہے جب کہ دونوں فائلیں ایک ہی نام پر مشتمل ہوتی ہیں۔ دوسری طرف، بلڈ کمانڈ $(CXX) $(CXXFLAGS) -o $(ٹارگٹ) $(OBJS) ایک آبجیکٹ فائل اور ایک نئی ٹارگٹ فائل کو آپس میں جوڑنے کے لیے استعمال کیا جاتا ہے۔ اسی طرح، بلڈ کمانڈ $(CXX) $(CXXFLAGS) -c $< -o $@ ماخذ فائل کو ایک آبجیکٹ فائل میں مرتب کرتا ہے۔





انحصار: جب آپ میک فائل بنانا چاہتے ہیں تو انحصار ہمیشہ موجود ہوتا ہے۔ مثال کے طور پر، 'تمام' ہدف 'ٹارگٹ' متغیر پر منحصر ہے جبکہ 'ٹارگٹ' 'OBJS' متغیر پر منحصر ہے۔ ایک ہی وقت میں، 'OBJS' متغیر 'SRCS' متغیر کے ذریعے سورس فائل پر منحصر ہے۔

تبصرے: انسانی سمجھ میں آنے والی ہدایات عام طور پر کوڈ لائن کے مقصد کی وضاحت کے لیے استعمال کی جاتی ہیں اگر آپ کسی فائل کو طویل عرصے کے بعد استعمال کر رہے ہیں۔ مندرجہ ذیل میک فائل میں، ہم ہر سطر کی وضاحت کے لیے '#' نشان سے شروع ہونے والے تبصروں کا استعمال کرتے ہیں۔



CXX = g++
CXXFLAGS = -std =c++ گیارہ -دیوار
ٹارگٹ = نیا
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
تمام: $ ( ہدف )
$ ( ہدف ) :$ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( ہدف ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
صاف:
rm -f $ ( ہدف ) $ ( OBJS )

مشترکہ مسائل اور حل

کسی بھی میک فائل کو لکھتے وقت، آخر میں مطلوبہ آؤٹ پٹ حاصل کرنے کے لیے ہر معمولی تفصیل پر غور کرنا ضروری ہے۔ میک فائل بناتے وقت صارفین کو اکثر کچھ عام مسائل کا سامنا کرنا پڑتا ہے۔ اس سیکشن کے اندر، ہم ان مسائل پر تبادلہ خیال کریں گے اور مندرجہ ذیل ممکنہ حل تجویز کریں گے۔

1: متغیرات کا استعمال نہ کرنا

میک فائل میں متغیرات کا استعمال ایک لازمی چیز ہے کیونکہ اسے کمپائلرز، ٹارگٹ، سورس فائلز وغیرہ کو سیٹ کرنے کی ضرورت ہے۔ لہذا، یقینی بنائیں کہ ضروری متغیرات جیسے CXX، CXXFLAGSc(compiler flags)، TARGET، SRCS، اور OBJS کو پچھلے نمونے کی میک فائل میں استعمال کریں۔

2: الگ کرنے والا مسئلہ غائب ہے۔

میک فائل لکھتے وقت، انڈینٹیشن کے اصولوں پر بہت دھیان سے غور کرنا ضروری ہے کیونکہ ٹیبز کے بجائے خالی جگہوں کا استعمال آپ کو 'میک' انسٹرکشن پر عملدرآمد کے دوران 'گمشدہ جداکار' کے مسئلے کی طرف لے جائے گا۔ مثال کے طور پر، ہم لائن 13 پر ایک اصول کے شروع میں جگہ شامل کرتے ہیں اور ٹیب کو ہٹا دیتے ہیں۔

$ ( ہدف ) :$ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( ہدف ) $ ( OBJS )

'میک' استفسار پر عمل درآمد پر، ہمیں لائن 13 پر 'گمشدہ جداکار' کی خرابی ملتی ہے، اور فائل چلنا بند ہو جاتی ہے۔ اس مسئلے سے بچنے کے لیے، خالی جگہوں کے بجائے 'ٹیب' کا استعمال یقینی بنائیں۔

بنانا

اس مسئلے سے بچنے کے لیے، اسپیس کے بجائے 'ٹیب' کا استعمال یقینی بنائیں جیسا کہ مندرجہ ذیل تصویر میں دکھایا گیا ہے۔

$ ( ہدف ) :$ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( ہدف ) $ ( OBJS )

3: 'انٹری پوائنٹ نہیں ملا' مسئلہ

یہ خرابی زیادہ تر سورس فائل کی وجہ سے ہوتی ہے نہ کہ میک فائل کی وجہ سے جب آپ سورس کوڈ فائل میں 'مین()' فنکشن کا استعمال چھوڑ دیتے ہیں۔ مثال کے طور پر، ہم مین() فنکشن کی تعریف کو صارف کی طرف سے طے شدہ فنکشن ڈیکلریشن سے بدل دیتے ہیں۔

# شامل کریں
int شو ( ) {
char v;
std::cout << 'ایک قدر درج کریں:' ;
std::cin >> میں
std::cout << میں << std::endl;
واپسی 0 ;
}

ونڈوز کے کمانڈ پرامپٹ پر 'میک' ہدایات پر عمل کرنے پر، ہمیں 'WinMain' کا غیر متعینہ حوالہ ملتا ہے۔ اس کی وجہ یہ ہے کہ مرتب کرنے والے کو C++ فائل پر عمل درآمد شروع کرنے کے لیے کوئی انٹری پوائنٹ نہیں ملتا ہے۔ اس کو حل کرنے کے لیے، 'شو' کو 'مین' سے بدل دیں۔

4: غلط ایکسٹینشن کا استعمال

بعض اوقات، صارف غیر ارادی طور پر میک فائل میں استعمال ہونے والی سورس فائل کے لیے غلط ایکسٹینشن استعمال کر سکتا ہے۔ غلط ایکسٹینشن کا استعمال رن ٹائم غلطیوں کا باعث بنے گا، یعنی ہدف بنانے کا کوئی اصول نہیں۔ ہم C++ فائل کے لیے قابل عمل اور آبجیکٹ فائل بنانے کے لیے ایک میک فائل بناتے ہیں۔ ساتویں لائن میں، ہم سورس فائل کو 'c' ایکسٹینشن کے ساتھ فراہم کرتے ہیں۔

CXX := g++
CXXFLAGS := -std =c++ گیارہ -دیوار
ٹارگٹ = نیا
SRCS = main.c
OBJS = $ ( SRCS:.cpp=.o )
تمام: $ ( ہدف )
$ ( ہدف ) :$ ( OBJS )

'make' انسٹرکشن کو چلانا ہمیں 'ٹارگٹ 'main.c' کو بنانے کا کوئی اصول نہیں' غلطی کی طرف لے جاتا ہے۔ اس مسئلے سے بچنے کے لیے، درست سورس فائل ایکسٹینشن کا استعمال یقینی بنائیں۔

بنانا

5: لاپتہ انحصار

میک فائل لکھتے وقت، آپ کو مطلوبہ آؤٹ پٹ حاصل کرنے کے لیے سورس فائل کے لیے تمام انحصار شامل کرنا چاہیے۔ مثال کے طور پر، ہماری C++ کوڈ فائل 'myheader.h' فائل کو اپنی انحصار کے طور پر استعمال کرتی ہے۔ لہذا، ہم اس کا ذکر C++ کوڈ فائل میں درج ذیل کرتے ہیں:

# شامل کریں
# 'myheader.h' شامل کریں
int شو ( ) {
char v;
std::cout << 'ایک قدر درج کریں:' ;
std::cin >> میں
std::cout << میں << std::endl;
واپسی 0 ;
}

میک فائل کے اندر، ہم جان بوجھ کر 'myheader.h' فائل کے استعمال کو نظر انداز کر دیتے ہیں جو کہ 9 لائن پر لکھی گئی بلڈ رول کے اندر ہے۔

% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -او $ @

اب، 'میک' انسٹرکشن کا استعمال کرتے ہوئے، ہمیں 'سب کے لیے کچھ نہیں کرنا' غلطی کا سامنا کرنا پڑتا ہے۔

بنانا

% .O: % .cpp myheader.h
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @

مذکورہ مسئلے سے بچنے اور سورس کوڈ کو کامیابی سے چلانے کے لیے، میک فائل کی نویں لائن میں 'myheader.h' فائل کا نام درج کریں جیسا کہ درج ذیل میں دکھایا گیا ہے:

نتیجہ

اس گائیڈ کے اندر، ہم نے میک فائل کے نحو کو اس کے ضروری مواد جیسے متغیرات، تعمیراتی کمانڈز، قواعد وغیرہ کا استعمال کرتے ہوئے اچھی طرح سے سمجھا دیا ہے۔ نحو کو مزید واضح کرنے کے لیے کوڈ کی مثال شامل کی گئی ہے۔ آخر میں، ہم نے کچھ باقاعدہ مسائل اور ان کے حل پر بات کی جن کا سامنا صارف کو میک فائل بناتے وقت ہو سکتا ہے۔