-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
ทดสอบใน Ubuntu 19.04 amd64, GCC 8.3.0
เป้าหมายที่กำหนดไว้ล่วงหน้าของ CMake
CMake จัดเตรียมเป้าหมายสำหรับไฟล์ที่ประมวลผลล่วงหน้าโดยอัตโนมัติ:
make help
แสดงให้เราเห็นว่าเราสามารถทำได้:
make main.i
และเป้าหมายนั้นทำงาน:
Preprocessing C source to CMakeFiles/main.dir/main.c.i
/usr/bin/cc -E /home/ciro/bak/hello/main.c > CMakeFiles/main.dir/main.c.i
เพื่อให้สามารถดูไฟล์ได้ที่ CMakeFiles/main.dir/main.c.i
ทดสอบกับ cmake 3.16.1