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



有没有办法像在Windows操作系统中那样在ubuntu 20.04中预编译<bits/stdc++.h>头文件,这样我就可以在Sublime文本编辑器中更快地执行程序?

我使用FastOlympicCoding扩展来快速执行,但我怀念使用输入输出文件的旧方法。我到处找,但没有找到任何"外行"的方法。

创建预编译头的示例:

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>nnint 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

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

  • 它不可移植,因此需要由丑陋的#ifdefs保护。

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

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

  1. 使用g++ -xc++-header /path/to/bits/stdc++.h -o stdc++.h.gch预编译标头。

  2. 包括在-include:g++ foo.cpp -include stdc++.h中。

请注意,-include会自动将.gch附加到文件名中;当前目录不必包含CCD_ 13。

如果没有.gch文件,则-include会返回到包含常规非PCH标头(如果存在(。如果两者都存在于包含路径中,则PCH将获得优先权。

在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为空的情况下重新编译它。


编辑:另一件需要考虑的事情(我也无法测试(就是在my_pch.h中包括您实际使用的东西(stringvector,等等(。在构建预编译头时,这可能无论如何都会引入bits/stdc++.h。把它列成一个全面的列表,这样你就不需要不断地添加它了。然后你就有了可移植的代码,人们就不会一直为此抨击你了。

因此,在得到@TedLingmo答案的帮助并做了更多的研究后,我决定用更清晰的步骤自己回答这个问题。

PS这个答案将更适合那些在自定义构建文件中使用sublime并且使用Linux操作系统(Ubuntu(的人

  1. 您需要找到stdc++.h头文件所在的位置,因此打开终端并使用命令:

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

    输出:

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

  2. 转到上面的位置并打开那里的终端,现在我们可以预编译bits/stdc++.h头文件了。

  3. 使用以下命令:

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

  4. 您将看到stdc++.h.gch文件现在已经创建,这意味着预编译已经完成。

PS:您需要使用sudo,因为当g++生成stdc++.h.gch文件时,我们需要root权限。

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

它对我来说非常有效,所以我希望它也能帮助你!

相关内容

  • 没有找到相关文章

最新更新