전처리 후 gcc가 C코드를 출력할 수 있습니까?
저는 오픈 소스 라이브러리를 사용하고 있는데, C 이외의 여러 언어를 지원하기 위한 전처리 지침이 많은 것 같습니다.라이브러리의 기능을 연구하기 위해서, 전처리 후에 컴파일 하는 C코드를 보고 싶습니다.
gcc(또는 Linux에서 일반적으로 사용 가능한 다른 도구)는 이 라이브러리를 읽을 수 있지만 전처리가 무엇으로 변환되어 사람이 읽을 수 있는 C 코드를 출력할 수 있습니까?
네. gcc를 넘겨주세요.-E
선택.이렇게 하면 사전 처리된 소스 코드가 출력됩니다.
cpp
는 프리프로세서입니다.
달려.cpp filename.c
사전 처리된 코드를 출력하거나 더 나은 방법으로 파일을 리다이렉트합니다.cpp filename.c > filename.preprocessed
.
gcc를 프리프로세서(html 파일용)로 사용하고 있습니다.당신이 원하는 대로 할 수 있어요.이 명령어는 "#--" 명령어를 확장한 다음 읽을 수 있는 파일을 출력합니다. (다른 C/HTML 프리프로세서는 이 명령어를 실행하지 않습니다.이 명령어는 행 연결, 특수 문자 초크 등입니다.)gcc가 설치되어 있는 경우 명령줄은 다음과 같습니다.
gcc - E - x c - P - C - traditional - cpp code _ before . cpp > code _ after . cpp
('cpp'일 필요는 없습니다.)http://www.cs.tut.fi/~jkorpela/cpre.http://cpre.http:/http://www.cs.tut.fi/ 에 이 사용법에 대한 훌륭한 설명이 있습니다.
"-traditional-cpp"는 공백과 탭을 유지합니다.
-save-temps
이것도 고려해야 할 좋은 옵션입니다.
gcc -save-temps -c -o main.o 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
이 은 음음음음 음음 so 음 so음 so so so so so so so so에서 볼수 있습니다.CMakeFiles/main.dir/main.c.i
cmake 3.16.1로 테스트.
행::
gcc -E <file>.c
또는
g++ -E <file>.cpp
파일이 Message.cpp 또는 .c 파일이라고 가정합니다.
순서 1: 전처리(인수)-E
)
g++ -E .\Message.cpp > P1
생성된 P1 파일은 매크로가 확장되어 헤더 파일의 내용과 코멘트가 삭제됩니다.
순서 2: 사전 처리된 파일을 어셈블리로 변환(인수)-S
은 컴파일러가
g++ -S .\Message.cpp
어셈블러(ASM)가 생성됩니다(Message).모든 어셈블리 코드가 있습니다.
순서 3: 어셈블리 코드를 오브젝트 코드로 변환합니다.주의: Message.s는 스텝2에서 생성되었습니다.
g++ -c .\Message.s
Message.o라는 이름의 개체 파일이 생성됩니다.바이너리 형식입니다.
스텝 4: 오브젝트 파일 링크이 작업은 링커에 의해 수행됩니다.
g++ .\Message.o -o MessageApp
여기서 MessageApp.exe 파일이 생성됩니다.
#include <iostream>
using namespace std;
//This a sample program
int main()
{
cout << "Hello" << endl;
cout << PQR(P,K) ;
getchar();
return 0;
}
언급URL : https://stackoverflow.com/questions/4900870/can-gcc-output-c-code-after-preprocessing
'programing' 카테고리의 다른 글
datadir 소유권은 재부팅 후 매번 mysql:mysql로 리셋됩니다. (0) | 2022.10.22 |
---|---|
Mac OS X Yosemite/El Capitan에서 MySQL Server 자동 부팅 (0) | 2022.10.22 |
Python에서 날짜에 날짜 추가 (0) | 2022.10.22 |
Python은 클래스에 "개인" 변수를 가지고 있습니까? (0) | 2022.10.22 |
Java가 이미지를 버퍼 이미지로 변환 (0) | 2022.10.22 |