Memahami Sintaks Makefile: Isu dan Penyelesaian Biasa (Termasuk 'Operator Hilang' dan 'Titik Kemasukan Tidak Ditemui')

Memahami Sintaks Makefile Isu Dan Penyelesaian Biasa Termasuk Operator Hilang Dan Titik Kemasukan Tidak Ditemui



Sama seperti fail kod mengandungi satu atau lebih baris kod sebagai kandungan untuk menjadikannya berbaloi, fail make asas dibina menggunakan pembolehubah, peraturan dan sasaran. Selain daripada itu, terdapat juga faktor lain yang diperlukan untuk membuat fail buatan yang lengkap tanpa sebarang masalah. Dalam panduan ini, kami akan membincangkan sintaks asas makefile dan isu biasa semasa menulis fail makefile dan menyediakan penyelesaian untuk menyelesaikan isu tersebut.

Memahami Sintaks Asas Makefile

Untuk bermula dengan penciptaan makefile, kami menerangkan sifat asas makefile melalui contoh kod makefile. Ia perlu memasukkan sifat sintaks berikut dalam kandungan makefile untuk mendapatkan fail boleh laku:







Pembolehubah s: Data asas menyimpan objek yang diperlukan untuk digunakan dalam makefile. Pembolehubah ini digunakan untuk menentukan pengkompil, bendera, fail sumber, fail objek dan fail sasaran. Dalam contoh makefile berikut, terdapat sejumlah lima pembolehubah iaitu CXX (untuk menetapkan pengkompil C++), CXXFLAGSc (bendera pengkompil), TARGET (untuk menetapkan nama fail boleh laku sasaran), SRCS (untuk menetapkan fail kod sumber) , OBJS (untuk mengandungi fail objek yang dijana melalui fail kod sumber).



Sasaran: Output yang dijangka akan dibina daripada sumber. Ia boleh menjadi fail sasaran atau sebarang nama simbolik: 'semua' ialah sasaran lalai yang harus dibina melalui pembolehubah 'TARGET', '$TARGET' bergantung pada pembolehubah 'OBJS' dan sasaran 'bersih' mengalih keluar sasaran dan fail objek daripada direktori kerja.



Peraturan dan Perintah Bina: Set arahan asas untuk dilaksanakan untuk mencipta sasaran daripada fail sumber atau kebergantungan. Sebagai contoh, peraturan '%.o: %.cpp' memaparkan bahawa fail dengan sambungan 'cpp' digunakan untuk mencipta fail objek dengan sambungan 'o' manakala kedua-dua fail mengandungi nama yang sama. Sebaliknya, arahan bina $(CXX) $(CXXFLAGS) -o $(SASARAN) $(OBJS) digunakan untuk memautkan fail objek dan fail sasaran baharu bersama-sama. Dengan cara yang sama, arahan bina $(CXX) $(CXXFLAGS) -c $< -o $@ menyusun fail sumber ke dalam fail objek.





Kebergantungan: Ketergantungan sentiasa ada apabila anda ingin mencipta fail make. Sebagai contoh, sasaran 'semua' bergantung pada pembolehubah 'SASARAN' manakala 'SASARAN' bergantung pada pembolehubah 'OBJS'. Pada masa yang sama, pembolehubah 'OBJS' bergantung pada fail sumber melalui pembolehubah 'SRCS'.

Komen: Arahan yang boleh difahami manusia biasanya digunakan untuk menerangkan tujuan baris kod sekiranya anda menggunakan fail selepas masa yang lama. Dalam makefile berikut, kami menggunakan ulasan bermula dengan tanda '#' untuk menerangkan setiap baris.



CXX = g++
CXXFLAGS = -std =c++ sebelas -Dinding
SASARAN = Baru
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
semua: $ ( SASARAN )
$ ( SASARAN ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( SASARAN ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
bersih:
rm -f $ ( SASARAN ) $ ( OBJS )

Isu dan Penyelesaian Biasa

Semasa menulis sebarang makefile, adalah perlu untuk mempertimbangkan setiap butiran kecil untuk mendapatkan output yang dikehendaki pada penghujungnya. Beberapa isu biasa sering dihadapi oleh pengguna semasa membuat fail buatan. Dalam bahagian ini, kami akan membincangkan isu tersebut dan mencadangkan penyelesaian yang mungkin seperti berikut:

1: Tidak Menggunakan Pembolehubah

Menggunakan pembolehubah dalam fail make adalah satu kemestian kerana ia diperlukan untuk menetapkan penyusun, sasaran, fail sumber, dll. Isu paling biasa yang boleh dihadapi ialah tidak menggunakan sebarang pembolehubah dalam fail make. Oleh itu, pastikan anda menggunakan pembolehubah penting seperti CXX, CXXFLAGSc(bendera pengkompil), TARGET, SRCS dan OBJS dalam makefile sampel sebelumnya.

2: Isu Pemisah Hilang

Semasa menulis fail make, anda perlu mempertimbangkan peraturan lekukan dengan sangat teliti kerana menggunakan ruang dan bukannya tab akan membawa anda kepada isu 'pemisah hilang' semasa pelaksanaan arahan 'buat'. Sebagai contoh, kami menambah ruang pada permulaan peraturan pada baris 13 dan mengalih keluar tab.

$ ( SASARAN ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( SASARAN ) $ ( OBJS )

Selepas pelaksanaan pertanyaan 'buat', kami mendapat ralat 'pemisah hilang' pada baris 13, dan fail berhenti berjalan. Untuk mengelakkan isu ini, pastikan anda menggunakan 'tab' dan bukannya ruang.

buat

Untuk mengelakkan isu ini, pastikan anda menggunakan 'tab' dan bukannya ruang seperti yang digambarkan dalam imej berikut:

$ ( SASARAN ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( SASARAN ) $ ( OBJS )

3: Isu “Entry Point Not Found”.

Ralat ini kebanyakannya berlaku disebabkan oleh fail sumber dan bukan kerana fail make seperti apabila anda terlepas penggunaan fungsi 'utama()' dalam fail kod sumber. Sebagai contoh, kami menggantikan definisi fungsi main() dengan pengisytiharan fungsi yang ditakrifkan pengguna ringkas.

#include
pertunjukan int ( ) {
char v;
std::cout << 'Masukkan nilai: ' ;
std::cin >> dalam;
std::cout << dalam << std::endl;
kembali 0 ;
}

Apabila melaksanakan arahan 'buat' pada prompt arahan Windows, kami menemui 'rujukan tidak ditentukan kepada 'WinMain''. Ini kerana pengkompil tidak menemui sebarang titik masuk untuk mula melaksanakan fail C++. Untuk menyelesaikan masalah ini, gantikan 'tunjukkan' dengan 'utama'.

4: Penggunaan Sambungan yang Salah

Kadangkala, pengguna mungkin secara tidak sengaja menggunakan sambungan yang salah untuk fail sumber untuk digunakan dalam makefile. Menggunakan sambungan yang salah akan membawa kepada ralat masa jalan, iaitu tiada peraturan untuk membuat sasaran. Kami mencipta fail make untuk membina fail boleh laku dan objek untuk fail C++. Dalam baris ketujuh, kami menyediakan fail sumber dengan sambungan 'c'.

CXX := g++
CXXFLAGS := -std =c++ sebelas -Dinding
SASARAN = baru
SRCS = utama.c
OBJS = $ ( SRCS:.cpp=.o )
Semua: $ ( SASARAN )
$ ( SASARAN ) : $ ( OBJS )

Menjalankan arahan 'buat' membawa kita kepada ralat 'Tiada peraturan untuk membuat sasaran 'utama.c''. Untuk mengelakkan isu ini, pastikan anda menggunakan sambungan fail sumber yang betul.

buat

5: Ketergantungan yang Hilang

Semasa menulis fail make, anda harus memasukkan semua kebergantungan untuk fail sumber untuk mendapatkan output yang diingini. Sebagai contoh, fail kod C++ kami menggunakan fail 'myheader.h' sebagai kebergantungannya. Oleh itu, kami menyebutnya dalam fail kod C++ seperti berikut:

#include
#include “myheader.h”
pertunjukan int ( ) {
char v;
std::cout << 'Masukkan nilai: ' ;
std::cin >> dalam;
std::cout << dalam << std::endl;
kembali 0 ;
}

Dalam makefile, kami sengaja mengabaikan penggunaan fail 'myheader.h' dalam peraturan binaan yang ditulis pada baris 9.

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

Sekarang, semasa menggunakan arahan 'buat', kami menghadapi ralat 'Tiada apa yang perlu dilakukan untuk 'semua''.

buat

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

Untuk mengelakkan isu tersebut dan menjalankan kod sumber dengan jayanya, sebutkan nama fail 'myheader.h' pada baris kesembilan fail make seperti yang digambarkan dalam perkara berikut:

Kesimpulan

Dalam panduan ini, kami menerangkan dengan teliti sintaks makefile menggunakan kandungan yang diperlukan seperti pembolehubah, arahan binaan, peraturan, dll. Contoh kod disertakan untuk menghuraikan sintaks dengan lebih jelas. Pada akhirnya, kami membincangkan beberapa isu biasa dan penyelesaiannya yang boleh dihadapi oleh pengguna semasa membuat fail buatan.