有没有办法像在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>
,至少有两个原因:
-
它不可移植,因此需要由丑陋的
#ifdef
s保护。 -
与GCC不同,Clang从不将PCH用于
#include
s。
相反,应该使用-include
标志包含PCH。这是GCC和Clang都接受的唯一选择。
-
使用
g++ -xc++-header /path/to/bits/stdc++.h -o stdc++.h.gch
预编译标头。 -
包括在
-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
中包括您实际使用的东西(string
、vector
,等等(。在构建预编译头时,这可能无论如何都会引入bits/stdc++.h
。把它列成一个全面的列表,这样你就不需要不断地添加它了。然后你就有了可移植的代码,人们就不会一直为此抨击你了。
因此,在得到@TedLingmo答案的帮助并做了更多的研究后,我决定用更清晰的步骤自己回答这个问题。
PS:这个答案将更适合那些在自定义构建文件中使用sublime并且使用Linux操作系统(Ubuntu(的人
您需要找到stdc++.h头文件所在的位置,因此打开终端并使用命令:
find /usr/include -name 'stdc++.h'
输出:
/usr/include/x86_64-linux-gnu/c++/11/bits/stdc++.h
转到上面的位置并打开那里的终端,现在我们可以预编译bits/stdc++.h头文件了。
使用以下命令:
sudo g++ -std=c++17 stdc++.h
您将看到stdc++.h.gch文件现在已经创建,这意味着预编译已经完成。
PS:您需要使用sudo,因为当g++生成stdc++.h.gch文件时,我们需要root权限。
注意:因为我在自定义构建文件中使用了c++17版本,所以我提到了c++17,所以您可以使用您正在使用的任何版本。
它对我来说非常有效,所以我希望它也能帮助你!