未使用预编译头文件,GCC

问题描述 投票:0回答:1

我完全按照官方文档中的说法这里,并且我在Google上找不到任何关于预编译头不起作用的结果。 我正在使用

gcc main.c -lSDL2 -lSDL2_image
进行编译,并且我已经使用
gcc <headername>
编译了标头。我使用 -H 来检查 PCH 是否正在使用,是否未使用,我还使用了大约 45 个标头,并且不使用标头时编译时间有明显差异。

示例:

// main.c
#include <stdio.h>

#include "header.h"

int main() {

    printf("%s\n", string);

    return 0;
}
// header.h
char* string = "Hello World!";

编译为

gcc -H main.c
使用
gcc header.h
编译标头后,它会给出相同的输出 输出:

. /usr/include/stdio.h
.. /usr/include/bits/libc-header-start.h
... /usr/include/features.h
.... /usr/include/features-time64.h
..... /usr/include/bits/wordsize.h
..... /usr/include/bits/timesize.h
...... /usr/include/bits/wordsize.h
.... /usr/include/sys/cdefs.h
..... /usr/include/bits/wordsize.h
..... /usr/include/bits/long-double.h
.... /usr/include/gnu/stubs.h
..... /usr/include/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include/stddef.h
.. /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include/stdarg.h
.. /usr/include/bits/types.h
... /usr/include/bits/wordsize.h
... /usr/include/bits/timesize.h
.... /usr/include/bits/wordsize.h
... /usr/include/bits/typesizes.h
... /usr/include/bits/time64.h
.. /usr/include/bits/types/__fpos_t.h
... /usr/include/bits/types/__mbstate_t.h
.. /usr/include/bits/types/__fpos64_t.h
.. /usr/include/bits/types/__FILE.h
.. /usr/include/bits/types/FILE.h
.. /usr/include/bits/types/struct_FILE.h
.. /usr/include/bits/types/cookie_io_functions_t.h
.. /usr/include/bits/stdio_lim.h
.. /usr/include/bits/floatn.h
... /usr/include/bits/floatn-common.h
.... /usr/include/bits/long-double.h
. header.h
Multiple include guards may be useful for:
/usr/include/bits/libc-header-start.h
/usr/include/bits/time64.h
/usr/include/bits/typesizes.h
/usr/include/features-time64.h
/usr/include/gnu/stubs-64.h
/usr/include/gnu/stubs.h
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include/stddef.h
header.h
c gcc precompiled-headers
1个回答
0
投票

正如文档所说

一旦看到第一个 C 令牌,就无法使用预编译头。”

但是,通过在

<stdio.h>
之前包含
"header.h"
<stdio.h>
包含大量 C 标记,因此不会使用预编译头。

尝试在

"header.h"
之前包含
<stdio.h
。或者更好的是,让
"header.h"
包含
<stdio.h>
,这样您就可以获得预编译的优势
stdio.h

另请注意,您的“header.h”包含定义,而不仅仅是声明,这可能会导致您在更大的项目中出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.