Saya memahami bahwa CFLAGS (atau CXXFLAGS untuk C ++) adalah untuk compiler, sedangkan CPPFLAGS digunakan oleh preprocessor.
Tapi saya masih belum mengerti bedanya.
Saya perlu menentukan jalur penyertaan untuk file header yang disertakan dengan #include - karena #include adalah arahan preprocessor, apakah preprocessor (CPPFLAGS) adalah satu-satunya hal yang saya pedulikan?
Dalam keadaan apa saya perlu memberi kompiler jalur penyertaan tambahan?
Secara umum, jika preprocessor menemukan dan menyertakan file header yang diperlukan, mengapa perlu diberi tahu tentang tambahan direktori include? Apa gunanya CFLAGS?
(Dalam kasus saya, saya benar-benar menemukan bahwa KEDUA ini memungkinkan saya untuk mengkompilasi program saya, yang menambah kebingungan ... Saya dapat menggunakan CFLAGS ATAU CPPFLAGS untuk mencapai tujuan saya (setidaknya dalam konteks autoconf). Apa yang memberi?)
Jawaban:
Aturan implisit make untuk kompilasi program C adalah
dimana
$()
sintaks memperluas variabel. Karena keduanyaCPPFLAGS
danCFLAGS
digunakan dalam panggilan kompilator, yang Anda gunakan untuk mendefinisikan jalur penyertaan adalah masalah selera pribadi. Misalnya jikafoo.c
adalah file di direktori saat iniakan memanggil kompilator Anda dengan cara yang persis sama, yaitu
Perbedaan antara keduanya mulai berlaku ketika Anda memiliki beberapa bahasa yang membutuhkan jalur penyertaan yang sama, misalnya jika Anda telah
bar.cpp
mencobanyamaka kompilasi akan dilakukan
karena aturan implisit C ++ juga menggunakan
CPPFLAGS
variabel.Perbedaan ini memberi Anda panduan yang baik untuk digunakan - jika Anda ingin flag digunakan untuk semua bahasa, masukkan ke dalam
CPPFLAGS
, jika itu untuk bahasa tertentuCFLAGS
,CXXFLAGS
dsb. Contoh tipe yang terakhir termasuk kepatuhan standar atau flag peringatan - Anda tidak ingin meneruskan-std=c99
ke kompiler C ++ Anda!Anda mungkin akan mendapatkan sesuatu seperti ini di makefile Anda
sumber
cpp
menggunakanCPPFLAGS
dan mengharapkan hasil yang wajar karena-std=c99
memengaruhi simbol mana yang ditentukan (terutama sebagai pengganti makro uji fitur). Sebaliknya, Anda membutuhkannya$(CC) $(CPPFLAGS) $(CFLAGS) -E
.The
CPPFLAGS
makro adalah satu untuk menggunakan untuk menentukan#include
direktori.Keduanya
CPPFLAGS
danCFLAGS
berfungsi dalam kasus Anda karena aturanmake
(1) menggabungkan preprocessing dan kompilasi dalam satu perintah (jadi kedua makro digunakan dalam perintah).Anda tidak perlu menentukan
.
sebagai direktori penyertaan jika Anda menggunakan formulir#include "..."
. Anda juga tidak perlu menentukan direktori penyertaan kompilator standar. Anda perlu menentukan semua direktori penyertaan lainnya.sumber
gcc -E
file - tidak ada #includes). Kebanyakan kompiler modern menggabungkan langkah-langkah pra-pemrosesan dan kompilasi, jadi Anda tidak perlu khawatir tentang ini.Anda setelah membuat aturan implisit .
sumber
Untuk menambahkan kepada mereka yang telah menyebutkan aturan implisit, yang terbaik adalah melihat apa yang telah didefinisikan secara implisit dan untuk env Anda menggunakan:
Misalnya:
yang mengembang
Ini juga akan mencetak
# environment
data. Di sini, Anda akan menemukan jalur penyertaan GCC di antara info berguna lainnya.Dalam membuat, ketika datang ke pencarian, jalannya banyak, cahayanya satu ... atau sesuatu untuk efek itu.
C_INCLUDE_PATH
untuk seluruh sistem, setel di shell Anda*.rc
.$(CPPFLAGS)
adalah untuk preprocessor jalur include.... atau bahkan lebih spesifik
buat menggunakan VPATH sebagai jalur pencarian umum jadi gunakan dengan hati-hati. Jika file ada di lebih dari satu lokasi yang terdaftar di VPATH, make akan mengambil kejadian pertama dalam daftar.
sumber