如何在 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
清空重新编译。
编辑: 另一件要考虑的事情(我也无法测试)只是包括你实际使用的东西(string
,vector
,随便什么)在 my_pch.h
。无论如何,在构建预编译头文件时,这可能会引入 bits/stdc++.h
。让它成为一个全面的列表,这样你就不需要不断地添加它。这样你就有了可移植的代码,人们就不会再为此责备你了。
所以,在得到@TedLyngmo 的回答的帮助并做了更多研究之后,我决定自己用更明确的步骤来回答这个问题。
PS:这个答案对于那些使用 sublime 和他们的自定义构建文件并且在 Linux OS (Ubuntu).
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
Go to the above location and open the terminal there and now we are ready to precompile bits/stdc++.h header file.
Use the following command:
sudo g++ -std=c++17 stdc++.h
You'll observe stdc++.h.gch file is now created implying that precompiling is done.
PS: 您需要使用 sudo 因为我们需要 root 权限 g++ 生成 stdc++.h.gch 文件。
注意: 因为我在我的自定义构建文件中使用了 c++17 版本所以我提到了 c++17 ,您可以使用您正在使用的任何版本。
它对我来说效果很好,希望对你也有帮助!
你 不应该 #include <bits/stdc++.h>
来自这个源代码,至少有两个原因:
不可携带,需要丑陋的#ifdef
守卫
与 GCC 不同,Clang 从不使用 PCH #include
s。
相反,您应该使用 -include
标志包含 PCH。这是 GCC 和 Clang 都接受的唯一选项。
使用 g++ -xc++-header /path/to/bits/stdc++.h -o stdc++.h.gch
.
预编译 header
将其包含在 -include
中:g++ foo.cpp -include stdc++.h
.
请注意 -include
会自动将 .gch
附加到文件名;当前目录不必包含 stdc++.h
.
如果没有 .gch
文件,-include
回退到包含常规 non-PCH header(如果存在)。如果两者都存在于包含路径中,则 PCH 优先。
有什么方法可以像在 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
清空重新编译。
编辑: 另一件要考虑的事情(我也无法测试)只是包括你实际使用的东西(string
,vector
,随便什么)在 my_pch.h
。无论如何,在构建预编译头文件时,这可能会引入 bits/stdc++.h
。让它成为一个全面的列表,这样你就不需要不断地添加它。这样你就有了可移植的代码,人们就不会再为此责备你了。
所以,在得到@TedLyngmo 的回答的帮助并做了更多研究之后,我决定自己用更明确的步骤来回答这个问题。
PS:这个答案对于那些使用 sublime 和他们的自定义构建文件并且在 Linux OS (Ubuntu).
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
Go to the above location and open the terminal there and now we are ready to precompile bits/stdc++.h header file.
Use the following command:
sudo g++ -std=c++17 stdc++.h
You'll observe stdc++.h.gch file is now created implying that precompiling is done.
PS: 您需要使用 sudo 因为我们需要 root 权限 g++ 生成 stdc++.h.gch 文件。
注意: 因为我在我的自定义构建文件中使用了 c++17 版本所以我提到了 c++17 ,您可以使用您正在使用的任何版本。
它对我来说效果很好,希望对你也有帮助!
你 不应该 #include <bits/stdc++.h>
来自这个源代码,至少有两个原因:
不可携带,需要丑陋的
#ifdef
守卫与 GCC 不同,Clang 从不使用 PCH
#include
s。
相反,您应该使用 -include
标志包含 PCH。这是 GCC 和 Clang 都接受的唯一选项。
使用
预编译 headerg++ -xc++-header /path/to/bits/stdc++.h -o stdc++.h.gch
.将其包含在
-include
中:g++ foo.cpp -include stdc++.h
.
请注意 -include
会自动将 .gch
附加到文件名;当前目录不必包含 stdc++.h
.
如果没有 .gch
文件,-include
回退到包含常规 non-PCH header(如果存在)。如果两者都存在于包含路径中,则 PCH 优先。