如何在 ubuntu 20.04 中预编译 <bits/stdc++.h> 头文件?

How to Precompile <bits/stdc++.h> header file in ubuntu 20.04?

有什么方法可以像在 Windows OS 中那样在 ubuntu 20.04 中预编译 <bits/stdc++.h> 头文件,以便我可以更快地执行程序Sublime 文本编辑器?

我使用 FastOlympicCoding 扩展来快速执行,但我怀念使用输入输出文件的旧方法。我到处搜索但没有找到任何 'layman' 方法来做到这一点。

创建预编译的示例 header:

mkdir -p pch/bits &&
g++ -O3 -std=c++20 -pedantic-errors -o pch/bits/stdc++.h.gch \
   /usr/include/c++/11/x86_64-redhat-linux/bits/stdc++.h

检查你得到了什么:

$ file pch/bits/stdc++.h.gch
pch/bits/stdc++.h.gch: GCC precompiled header (version 014) for C++

$ ls -l pch/bits/stdc++.h.gch
-rw-r--r-- 1 ted users 118741428  8 mar 23.27 pch/bits/stdc++.h.gch

一个使用它的程序:

#include <bits/stdc++.h>

int main() {
    std::vector<int> foo{1, 2, 3};
    for(auto v : foo) std::cout << v << '\n';
}

示例编译(将 -Ipch 放在 -I 指令的第一个):

$ strace -f g++ -Ipch -O3 -std=c++20 -pedantic-errors -o program program.cpp 2>&1 | grep 'stdc++.h'
[pid 13964] read(3, "#include <bits/stdc++.h>\n\nint ma"..., 122) = 122
[pid 13964] newfstatat(AT_FDCWD, "pch/bits/stdc++.h.gch", {st_mode=S_IFREG|0644, st_size=118741428, ...}, 0) = 0
[pid 13964] openat(AT_FDCWD, "pch/bits/stdc++.h.gch", O_RDONLY|O_NOCTTY) = 4

基于 Ted 的回答,我实际上会做这样的事情(未经测试):

my_pch.h:

#include <bits/stdc++.h>          // might need to specify the full path here

然后:

g++ -O3 -std=c++20 -pedantic-errors -o pch/bits/my_pch.h.gch my_pch.h

最后,您的程序将如下所示:

#include "my_pch.h"

int main() {
    // ...
}

这意味着您不需要将 #include <bits/stdc++.h> 直接放在您的源文件中,因为那有点顽皮。这也意味着您可以根据需要将其他包含文件添加到 my_pch.h

我还认为,在包含 my_pch.h 之后放置 #include <string> 不会花费您任何费用,而且这样做可能是明智的。如果您打算将代码移至生产环境中,则可以将 my_pch.h 清空重新编译。


编辑: 另一件要考虑的事情(我也无法测试)只是包括你实际使用的东西(stringvector,随便什么)在 my_pch.h。无论如何,在构建预编译头文件时,这可能会引入 bits/stdc++.h。让它成为一个全面的列表,这样你就不需要不断地添加它。这样你就有了可移植的代码,人们就不会再为此责备你了。

所以,在得到@TedLyngmo 的回答的帮助并做了更多研究之后,我决定自己用更明确的步骤来回答这个问题。

PS这个答案对于那些使用 sublime 和他们的自定义构建文件并且在 Linux OS (Ubuntu).

  1. You need to find where stdc++.h header file is present, so open the terminal and use the command:

    find /usr/include -name 'stdc++.h'

    Output:

    /usr/include/x86_64-linux-gnu/c++/11/bits/stdc++.h

  2. Go to the above location and open the terminal there and now we are ready to precompile bits/stdc++.h header file.

  3. Use the following command:

    sudo g++ -std=c++17 stdc++.h

  4. You'll observe stdc++.h.gch file is now created implying that precompiling is done.

PS: 您需要使用 sudo 因为我们需要 root 权限 g++ 生成 std​​c++.h.gch 文件。

注意: 因为我在我的自定义构建文件中使用了 c++17 版本所以我提到了 c++17 ,您可以使用您正在使用的任何版本。

它对我来说效果很好,希望对你也有帮助!

不应该 #include <bits/stdc++.h> 来自这个源代码,至少有两个原因:

  • 不可携带,需要丑陋的#ifdef守卫

  • 与 GCC 不同,Clang 从不使用 PCH #includes。

相反,您应该使用 -include 标志包含 PCH。这是 GCC 和 Clang 都接受的唯一选项。

  1. 使用 g++ -xc++-header /path/to/bits/stdc++.h -o stdc++.h.gch.

    预编译 header
  2. 将其包含在 -include 中:g++ foo.cpp -include stdc++.h.

请注意 -include 会自动将 .gch 附加到文件名;当前目录不必包含 stdc++.h.

如果没有 .gch 文件,-include 回退到包含常规 non-PCH header(如果存在)。如果两者都存在于包含路径中,则 PCH 优先。