-save-temps
यह ध्यान में रखने के लिए एक और अच्छा विकल्प है:
gcc -save-temps -c -o main.o main.c
main.c
#define INC 1
int myfunc(int i) {
return i + INC;
}
और अब, सामान्य आउटपुट के अलावा main.o
, वर्तमान कार्यशील निर्देशिका में निम्न फाइलें भी शामिल हैं:
main.i
वांछित पसंदीदा फ़ाइल है:
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "main.c"
int myfunc(int i) {
return i + 1;
}
main.s
एक बोनस है :-) और इसमें शामिल विधानसभा है:
.file "main.c"
.text
.globl myfunc
.type myfunc, @function
myfunc:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
addl $1, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size myfunc, .-myfunc
.ident "GCC: (Ubuntu 8.3.0-6ubuntu1) 8.3.0"
.section .note.GNU-stack,"",@progbits
यदि आप इसे बड़ी संख्या में फ़ाइलों के लिए करना चाहते हैं, तो इसके बजाय उपयोग करने पर विचार करें:
-save-temps=obj
जो मध्यवर्ती फ़ाइलों को -o
वर्तमान कार्य निर्देशिका के बजाय ऑब्जेक्ट आउटपुट के समान निर्देशिका में सहेजता है , इस प्रकार संभावित बेसनेम टकराव से बचता है।
इस विकल्प पर लाभ यह -E
है कि किसी भी बिल्ड स्क्रिप्ट में इसे जोड़ना आसान है, बिना बिल्ड में ज्यादा दखल दिए।
इस विकल्प के बारे में एक और अच्छी बात यह है कि यदि आप जोड़ते हैं -v
:
gcc -save-temps -c -o main.o -v main.c
यह वास्तव में बदसूरत अस्थायी के बजाय उपयोग की जा रही स्पष्ट फाइलों को दिखाता है /tmp
, इसलिए यह जानना आसान है कि क्या चल रहा है, जिसमें प्रीप्रोसेसिंग / संकलन / असेंबली चरण शामिल हैं:
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu main.c -mtune=generic -march=x86-64 -fpch-preprocess -fstack-protector-strong -Wformat -Wformat-security -o main.i
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -fpreprocessed main.i -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase-strip main.o -version -fstack-protector-strong -Wformat -Wformat-security -o main.s
as -v --64 -o main.o main.s
उबंटू में परीक्षण 19.04 amd64, GCC 8.3.0।