Разбиране на синтаксиса на Makefile: Често срещани проблеми и решения (включително „Липсващ оператор“ и „Входна точка не е намерена“)

Razbirane Na Sintaksisa Na Makefile Cesto Sresani Problemi I Resenia Vklucitelno Lipsvas Operator I Vhodna Tocka Ne E Namerena



Точно както кодовият файл съдържа един или повече реда код като съдържание, за да си струва, основният makefile се конструира с помощта на променливи, правила и цели. Освен това, има и други фактори, които са необходими, за да направите пълен makefile без никакви проблеми. В това ръководство ще обсъдим основния синтаксис на makefile и често срещаните проблеми при писането на makefile и ще предоставим решения за разрешаване на тези проблеми.

Разбиране на основния синтаксис на Makefile

За да започнете със създаването на makefile, ние обясняваме основните свойства на makefile чрез примера за код на makefile. Необходимо е да включите следните синтактични свойства в съдържанието на makefile, за да получите изпълним файл:





Променлива s: Основни обекти за съхранение на данни, които са необходими за използване в make-файла. Тези променливи се използват за указване на компилатор, флагове, изходни файлове, обектни файлове и целеви файлове. В рамките на следния примерен makefile има общо пет променливи, които са CXX (за задаване на C++ компилатор), CXXFLAGSc (флагове на компилатор), TARGET (за задаване на целево име на изпълним файл), SRCS (за задаване на файл с изходен код) , OBJS (да съдържа обектните файлове, които са генерирани чрез файла с изходния код).



Цели: Очакван изход за изграждане от източника. Това може да бъде целеви файл или произволно символно име: „all“ е целта по подразбиране, която трябва да бъде изградена чрез променливата „TARGET“, „$TARGET“ зависи от променливите „OBJS“, а „чистата“ цел премахва целта и обектни файлове от работната директория.



Правила и команди за изграждане: Набор от основни инструкции, които трябва да бъдат изпълнени за създаване на цел от изходния файл или зависимости. Например правилото „%.o: %.cpp“ показва, че файлът с разширение „cpp“ се използва за създаване на обектен файл с разширение „o“, докато и двата файла съдържат едно и също име. От друга страна, командата за изграждане $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) се използва за свързване на обектен файл и нов целеви файл заедно. По същия начин, командата за изграждане $(CXX) $(CXXFLAGS) -c $< -o $@ компилира изходния файл в обектен файл.





Зависимости: Зависимостите винаги са налице, когато искате да създадете makefile. Например целта „всички“ зависи от променливата „TARGET“, докато „TARGET“ зависи от променливата „OBJS“. В същото време променливата „OBJS“ зависи от изходния файл чрез променливата „SRCS“.

коментари: Обикновено се използват разбираеми за човека инструкции, за да се обясни целта на кодовия ред в случай, че използвате файл след дълго време. В следния makefile използваме коментарите, започващи със знака „#“, за да обясним всеки ред.



CXX = g++
CXXFLAGS = -стандартно =c++ единадесет -Стена
TARGET = Ново
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
всички: $ ( МИШЕНА )
$ ( МИШЕНА ) : $ ( OBJS )
$ ( CXX ) $ ( CXXФЛАГИ ) $ ( МИШЕНА ) $ ( OBJS )
% .О: % .cpp
$ ( CXX ) $ ( CXXФЛАГИ ) -° С $ < $ @
чисто:
rm -f $ ( МИШЕНА ) $ ( OBJS )

Често срещани проблеми и решения

Докато пишете всеки makefile, е необходимо да вземете предвид всеки незначителен детайл, за да получите желания резултат в края. Някои често срещани проблеми се срещат често от потребителите, докато създават makefile. В този раздел ще обсъдим тези проблеми и ще предложим възможните решения, както следва:

1: Без използване на променливи

Използването на променливите в makefile е задължително, тъй като се изисква да зададете компилаторите, целта, изходните файлове и т.н. Най-често срещаният проблем, който може да възникне, е неизползването на променлива в makefile. Затова не забравяйте да използвате основните променливи като CXX, CXXFLAGSc (флагове на компилатор), TARGET, SRCS и OBJS в предишния примерен makefile.

2: Проблем с липсващ разделител

Докато пишете makefile, е необходимо да разгледате много внимателно правилата за отстъп, защото използването на интервали вместо табулатори ще ви доведе до проблем с „липсващ разделител“ по време на изпълнение на инструкцията „make“. Например добавяме интервала в началото на правило на ред 13 и премахваме раздела.

$ ( МИШЕНА ) : $ ( OBJS )
$ ( CXX ) $ ( CXXФЛАГИ ) $ ( МИШЕНА ) $ ( OBJS )

При изпълнението на заявката “make” получаваме грешка “missing separator” на ред 13 и файлът спира да се изпълнява. За да избегнете този проблем, уверете се, че използвате „tab“ вместо интервали.

направи

За да избегнете този проблем, уверете се, че използвате „tab“ вместо интервали, както е показано на следното изображение:

$ ( МИШЕНА ) : $ ( OBJS )
$ ( CXX ) $ ( CXXФЛАГИ ) $ ( МИШЕНА ) $ ( OBJS )

3: Проблем „Входната точка не е намерена“.

Тази грешка възниква най-вече поради изходния файл, а не поради make-файла, както когато пропуснете използването на функцията „main()“ във файла с изходния код. Например, заменяме дефиницията на функцията main() с проста декларация на функция, дефинирана от потребителя.

#include
int шоу ( ) {
char v;
std::cout << „Въведете стойност:“ ;
std::cin >> в;
std::cout << в << std::endl;
връщане 0 ;
}

При изпълнение на инструкцията „make“ в командния ред на Windows срещаме „недефинирана препратка към „WinMain““. Това е така, защото компилаторът не намира никаква входна точка, за да започне изпълнението на C++ файла. За да разрешите това, заменете „покажи“ с „основен“.

4: Използване на неправилни разширения

Понякога потребителят може неволно да използва грешни разширения за изходен файл, който да се използва в make-файла. Използването на грешно разширение ще доведе до грешки по време на изпълнение, т.е. няма правило за създаване на цел. Създаваме makefile, за да изградим изпълнимия и обектния файл за C++ файла. В седмия ред предоставяме изходния файл с разширение „c“.

CXX := g++
CXXFLAGS := -стандартно =c++ единадесет -Стена
TARGET = ново
SRCS = main.c
OBJS = $ ( SRCS:.cpp=.o )
Всички: $ ( МИШЕНА )
$ ( МИШЕНА ) : $ ( OBJS )

Изпълнението на инструкцията „make“ ни води до грешката „Няма правило за създаване на цел „main.c““. За да избегнете този проблем, уверете се, че използвате правилното разширение на изходния файл.

направи

5: Липсващи зависимости

Докато пишете makefile, трябва да включите всички зависимости за изходния файл, за да получите желания резултат. Например нашият C++ кодов файл използва файла „myheader.h“ като своя зависимост. Затова го споменаваме в кодовия файл на C++, както следва:

#include
#include “myheader.h”
int шоу ( ) {
char v;
std::cout << „Въведете стойност:“ ;
std::cin >> в;
std::cout << в << std::endl;
връщане 0 ;
}

В рамките на make-файла ние умишлено игнорираме използването на файла „myheader.h“ в рамките на правилото за изграждане, което е написано на ред 9.

% .О: % .cpp
$ ( CXX ) $ ( CXXФЛАГИ ) -° С $ < $ @

Сега, докато използваме инструкцията „make“, срещаме грешката „Нищо не трябва да се прави за „всички““.

направи

% .О: % .cpp myheader.h
$ ( CXX ) $ ( CXXФЛАГИ ) -° С $ < $ @

За да избегнете споменатия проблем и да изпълните изходния код успешно, споменете името на файла „myheader.h“ на деветия ред на make-файла, както е показано по-долу:

Заключение

В рамките на това ръководство подробно обяснихме синтаксиса на makefile, като използвахме необходимото му съдържание като променливи, команди за изграждане, правила и т.н. Примерът за код е включен, за да разработи синтаксиса по-ясно. В крайна сметка обсъдихме някои редовни проблеми и техните решения, които потребителят може да срещне, докато създава makefile.