மேக்ஃபைல் தொடரியல்: பொதுவான சிக்கல்கள் மற்றும் தீர்வுகள் ('மிஸ்ஸிங் ஆபரேட்டர்' மற்றும் 'என்ட்ரி பாயின்ட் இல்லை' உட்பட)

Mekhpail Totariyal Potuvana Cikkalkal Marrum Tirvukal Mis Sin Aparettar Marrum Entri Payint Illai Utpata



ஒரு குறியீட்டு கோப்பில் ஒன்று அல்லது அதற்கு மேற்பட்ட கோடுகளை உள்ளடக்கமாக இருப்பது போல், அடிப்படை மேக்ஃபைல் மாறிகள், விதிகள் மற்றும் இலக்குகளைப் பயன்படுத்தி உருவாக்கப்படுகிறது. இது தவிர, எந்த பிரச்சனையும் இல்லாமல் ஒரு முழுமையான மேக்ஃபைலை உருவாக்க தேவையான பிற காரணிகளும் உள்ளன. இந்த வழிகாட்டியில், மேக்ஃபைலை எழுதும் போது அடிப்படை மேக்ஃபைல் தொடரியல் மற்றும் பொதுவான சிக்கல்களைப் பற்றி விவாதித்து, அந்தச் சிக்கல்களைத் தீர்ப்பதற்கான தீர்வுகளை வழங்குவோம்.

மேக்ஃபைல் அடிப்படை தொடரியலைப் புரிந்துகொள்வது

மேக்ஃபைலை உருவாக்குவதைத் தொடங்க, மேக்ஃபைலின் அடிப்படை பண்புகளை மேக்ஃபைல் குறியீடு எடுத்துக்காட்டு மூலம் விளக்குகிறோம். இயங்கக்கூடிய கோப்பைப் பெற, மேக்ஃபைல் உள்ளடக்கத்தில் பின்வரும் தொடரியல் பண்புகளைச் சேர்ப்பது அவசியம்:







மாறி s: மேக்ஃபைலில் பயன்படுத்த வேண்டிய பொருட்களைச் சேமிக்கும் அடிப்படைத் தரவு. இந்த மாறிகள் ஒரு கம்பைலர், கொடிகள், மூலக் கோப்புகள், பொருள் கோப்புகள் மற்றும் இலக்கு கோப்புகளைக் குறிப்பிடப் பயன்படுத்தப்படுகின்றன. பின்வரும் மாதிரி மேக்ஃபைலில், மொத்தம் ஐந்து மாறிகள் உள்ளன, அவை CXX (C++ கம்பைலரை அமைக்க), CXXFLAGSc (தொகுப்பாளர் கொடிகள்), TARGET (இலக்கு இயங்கக்கூடிய கோப்பு பெயரை அமைக்க), SRCS (மூலக் குறியீடு கோப்பை அமைக்க) , OBJS (மூலக் குறியீடு கோப்பு வழியாக உருவாக்கப்படும் பொருள் கோப்புகளைக் கொண்டிருக்க).



இலக்குகள்: மூலத்திலிருந்து உருவாக்க எதிர்பார்க்கப்படும் வெளியீடு. இது ஒரு இலக்கு கோப்பாகவோ அல்லது ஏதேனும் குறியீட்டு பெயராகவோ இருக்கலாம்: 'அனைத்தும்' என்பது 'TARGET' மாறியின் வழியாக உருவாக்கப்பட வேண்டிய இயல்புநிலை இலக்காகும், '$TARGET' என்பது 'OBJS' மாறிகளைப் பொறுத்தது, மேலும் 'சுத்தமான' இலக்கு இலக்கை நீக்குகிறது மற்றும் வேலை செய்யும் கோப்பகத்திலிருந்து பொருள் கோப்புகள்.



விதிகள் மற்றும் உருவாக்க கட்டளைகள்: மூலக் கோப்பு அல்லது சார்புகளிலிருந்து இலக்கை உருவாக்க செயல்படுத்த வேண்டிய அடிப்படை வழிமுறைகளின் தொகுப்பு. உதாரணமாக, '%.o: %.cpp' விதி 'cpp' நீட்டிப்புடன் கூடிய கோப்பு 'o' நீட்டிப்புடன் ஒரு ஆப்ஜெக்ட் கோப்பை உருவாக்கப் பயன்படுகிறது என்பதைக் காட்டுகிறது, அதே நேரத்தில் இரண்டு கோப்புகளும் ஒரே பெயரைக் கொண்டிருக்கும். மறுபுறம், உருவாக்க கட்டளை $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) ஒரு ஆப்ஜெக்ட் கோப்பையும் புதிய இலக்கு கோப்பையும் ஒன்றாக இணைக்கப் பயன்படுகிறது. அதே வழியில், உருவாக்க கட்டளை $(CXX) $(CXXFLAGS) -c $< -o $@ மூல கோப்பை ஒரு பொருள் கோப்பாக தொகுக்கிறது.





சார்புநிலைகள்: நீங்கள் ஒரு மேக்ஃபைலை உருவாக்க விரும்பும் போது சார்புகள் எப்போதும் இருக்கும். உதாரணமாக, 'அனைத்து' இலக்கு 'TARGET' மாறியைப் பொறுத்தது, அதே நேரத்தில் 'TARGET' 'OBJS' மாறியைப் பொறுத்தது. அதே நேரத்தில், 'OBJS' மாறியானது 'SRCS' மாறி மூலம் மூலக் கோப்பைச் சார்ந்தது.

கருத்துகள்: நீங்கள் நீண்ட காலத்திற்குப் பிறகு ஒரு கோப்பைப் பயன்படுத்தினால், குறியீட்டு வரியின் நோக்கத்தை விளக்குவதற்கு, மனிதர்களால் புரிந்துகொள்ளக்கூடிய வழிமுறைகள் பொதுவாகப் பயன்படுத்தப்படுகின்றன. பின்வரும் மேக்ஃபைலில், ஒவ்வொரு வரியையும் விளக்க, “#” அடையாளத்துடன் தொடங்கும் கருத்துகளைப் பயன்படுத்துகிறோம்.



CXX = g++
CXXFLAGS = -படிப்பு =c++ பதினொரு - சுவர்
TARGET = புதியது
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
அனைத்தும்: $ ( இலக்கு )
$ ( இலக்கு ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -ஓ $ ( இலக்கு ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -சி $ < -ஓ $ @
சுத்தமான:
rm -எஃப் $ ( இலக்கு ) $ ( OBJS )

பொதுவான சிக்கல்கள் மற்றும் தீர்வுகள்

எந்தவொரு மேக்ஃபைலையும் எழுதும்போது, ​​இறுதியில் விரும்பிய வெளியீட்டைப் பெற ஒவ்வொரு சிறிய விவரங்களையும் கருத்தில் கொள்வது அவசியம். மேக்ஃபைலை உருவாக்கும் போது சில பொதுவான சிக்கல்களை பயனர்கள் அடிக்கடி சந்திக்கின்றனர். இந்தப் பகுதிக்குள், அந்தப் பிரச்சினைகளைப் பற்றி விவாதித்து, சாத்தியமான தீர்வுகளைப் பின்வருமாறு பரிந்துரைப்போம்:

1: மாறிகளைப் பயன்படுத்துவதில்லை

கம்பைலர்கள், இலக்கு, மூலக் கோப்புகள் போன்றவற்றை அமைக்க வேண்டியிருப்பதால், மேக்ஃபைலில் மாறிகளைப் பயன்படுத்துவது அவசியம். மேக்ஃபைலில் எந்த மாறியையும் பயன்படுத்தாமல் இருப்பது மிகவும் பொதுவான பிரச்சினையாகும். எனவே, முந்தைய மாதிரி மேக்ஃபைலில் CXX, CXXFLAGSc(compiler flags), TARGET, SRCS மற்றும் OBJS போன்ற அத்தியாவசிய மாறிகளைப் பயன்படுத்துவதை உறுதிசெய்யவும்.

2: பிரிப்பான் சிக்கல் காணவில்லை

மேக்ஃபைலை எழுதும் போது, ​​உள்தள்ளல் விதிகளை மிகவும் கவனமாகக் கருத்தில் கொள்ள வேண்டும், ஏனெனில் தாவல்களுக்குப் பதிலாக இடைவெளிகளைப் பயன்படுத்துவது 'உருவாக்கு' அறிவுறுத்தலைச் செயல்படுத்தும் போது 'காணாமல் போன பிரிப்பான்' சிக்கலுக்கு வழிவகுக்கும். எடுத்துக்காட்டாக, வரி 13 இல் ஒரு விதியின் தொடக்கத்தில் இடத்தைச் சேர்த்து தாவலை அகற்றுவோம்.

$ ( இலக்கு ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -ஓ $ ( இலக்கு ) $ ( OBJS )

“உருவாக்கு” ​​வினவலைச் செயல்படுத்தும்போது, ​​​​வரி 13 இல் “காணாமல் போன பிரிப்பான்” பிழையைப் பெறுகிறோம், மேலும் கோப்பு இயங்குவதை நிறுத்துகிறது. இந்தச் சிக்கலைத் தவிர்க்க, இடைவெளிகளுக்குப் பதிலாக “டேப்” பயன்படுத்துவதை உறுதிசெய்யவும்.

செய்ய

இந்தச் சிக்கலைத் தவிர்க்க, பின்வரும் படத்தில் காட்டப்பட்டுள்ள இடைவெளிகளுக்குப் பதிலாக “தாவல்” ஐப் பயன்படுத்துவதை உறுதிசெய்யவும்:

$ ( இலக்கு ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -ஓ $ ( இலக்கு ) $ ( OBJS )

3: 'நுழைவு புள்ளி கிடைக்கவில்லை' சிக்கல்

இந்த பிழை பெரும்பாலும் மூலக் கோப்பின் காரணமாக ஏற்படுகிறது மற்றும் மூலக் குறியீடு கோப்பில் 'முதன்மை()' செயல்பாட்டை நீங்கள் தவறவிட்டால் போன்ற மேக்ஃபைல் காரணமாக அல்ல. உதாரணமாக, முக்கிய() செயல்பாட்டு வரையறையை ஒரு எளிய பயனர் வரையறுக்கப்பட்ட செயல்பாட்டு அறிவிப்புடன் மாற்றுவோம்.

# அடங்கும்
int நிகழ்ச்சி ( ) {
சார் வி;
std::cout << 'மதிப்பை உள்ளிடவும்:' ;
வகுப்பு::சின் >> உள்ளே;
std::cout << உள்ளே << std::endl;
திரும்ப 0 ;
}

விண்டோஸின் கட்டளை வரியில் “உருவாக்கு” ​​வழிமுறையை இயக்கும்போது, ​​​​“WinMain” க்கான வரையறுக்கப்படாத குறிப்பை நாங்கள் சந்திக்கிறோம். ஏனென்றால், C++ கோப்பை இயக்கத் தொடங்குவதற்கு கம்பைலர் எந்த நுழைவுப் புள்ளியையும் காணவில்லை. இதைத் தீர்க்க, 'காட்சி' என்பதை 'முக்கிய' என்று மாற்றவும்.

4: தவறான நீட்டிப்புகளைப் பயன்படுத்துதல்

சில நேரங்களில், ஒரு பயனர் தற்செயலாக தவறான நீட்டிப்புகளை மேக்ஃபைலில் பயன்படுத்த ஒரு மூலக் கோப்பைப் பயன்படுத்தலாம். தவறான நீட்டிப்பைப் பயன்படுத்துவது ரன்-டைம் பிழைகளுக்கு வழிவகுக்கும், அதாவது இலக்கை உருவாக்க எந்த விதியும் இல்லை. C++ கோப்பிற்கான இயங்கக்கூடிய மற்றும் பொருள் கோப்பை உருவாக்க மேக்ஃபைலை உருவாக்குகிறோம். ஏழாவது வரியில், 'c' நீட்டிப்புடன் மூல கோப்பை வழங்குகிறோம்.

CXX := g++
CXXFLAGS := -படிப்பு =c++ பதினொரு - சுவர்
TARGET = புதியது
SRCS = main.c
OBJS = $ ( SRCS:.cpp=.o )
அனைத்தும்: $ ( இலக்கு )
$ ( இலக்கு ) : $ ( OBJS )

'make' அறிவுறுத்தலை இயக்குவது, 'இலக்கு 'main.c' ஐ உருவாக்க விதி இல்லை' பிழைக்கு நம்மை அழைத்துச் செல்கிறது. இந்தச் சிக்கலைத் தவிர்க்க, சரியான மூல கோப்பு நீட்டிப்பைப் பயன்படுத்துவதை உறுதிசெய்யவும்.

செய்ய

5: சார்புகள் காணவில்லை

ஒரு மேக்ஃபைலை எழுதும் போது, ​​தேவையான வெளியீட்டைப் பெற, மூலக் கோப்பிற்கான அனைத்து சார்புகளையும் நீங்கள் சேர்க்க வேண்டும். எடுத்துக்காட்டாக, எங்கள் C++ குறியீடு கோப்பு “myheader.h” கோப்பை அதன் சார்புநிலையாகப் பயன்படுத்துகிறது. எனவே, அதை C++ குறியீடு கோப்பில் பின்வருமாறு குறிப்பிடுகிறோம்:

# அடங்கும்
#'myheader.h' அடங்கும்
int நிகழ்ச்சி ( ) {
சார் வி;
std::cout << 'மதிப்பை உள்ளிடவும்:' ;
வகுப்பு::சின் >> உள்ளே;
std::cout << உள்ளே << std::endl;
திரும்ப 0 ;
}

மேக்ஃபைலுக்குள், வரி 9 இல் எழுதப்பட்ட உருவாக்க விதிக்குள் “myheader.h” கோப்பைப் பயன்படுத்துவதை நாங்கள் வேண்டுமென்றே புறக்கணிக்கிறோம்.

% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -சி $ < -ஓ $ @

இப்போது, ​​'உருவாக்கு' அறிவுறுத்தலைப் பயன்படுத்தும் போது, ​​'அனைத்திற்கும்' செய்ய வேண்டிய ஒன்றும் இல்லை' என்ற பிழையை எதிர்கொள்கிறோம்.

செய்ய

% .O: % .cpp myheader.h
$ ( CXX ) $ ( CXXFLAGS ) -சி $ < -ஓ $ @

கூறப்பட்ட சிக்கலைத் தவிர்க்கவும், மூலக் குறியீட்டை வெற்றிகரமாக இயக்கவும், மேக்ஃபைலின் ஒன்பதாவது வரியில் 'myheader.h' கோப்பின் பெயரைக் குறிப்பிடவும்:

முடிவுரை

இந்த வழிகாட்டியில், மேக்ஃபைலின் தொடரியல், மாறிகள், உருவாக்க கட்டளைகள், விதிகள் போன்ற தேவையான உள்ளடக்கங்களைப் பயன்படுத்தி முழுமையாக விளக்கியுள்ளோம். தொடரியலை இன்னும் தெளிவாக விரிவுபடுத்த குறியீட்டு எடுத்துக்காட்டு சேர்க்கப்பட்டுள்ளது. முடிவில், மேக்ஃபைலை உருவாக்கும் போது பயனர் சந்திக்கும் சில வழக்கமான சிக்கல்கள் மற்றும் அவற்றின் தீர்வுகளைப் பற்றி விவாதித்தோம்.