C++ 如何编辑和重新构建GCC libstdc++;C++;标准库源代码?

C++ 如何编辑和重新构建GCC libstdc++;C++;标准库源代码?,c++,gcc,parallel-processing,stl,libstdc++,C++,Gcc,Parallel Processing,Stl,Libstdc++,我正在进行一些研究,并希望编辑libstdc++库中的一些源代码以供实验。具体来说,我对试验并行排序算法很感兴趣。有没有一个地方可以让我找到文档来轻松编辑和构建源代码 我尝试过构建libstdc++库的各种版本,但都没有成功。似乎大多数新版本都需要构建整个gcc包,这是一个非常漫长的过程,特别是如果我要在libstdc++中编辑和实验一些文件的话 我也找不到包含并行排序算法的源文件。我似乎只能找到定义函数的头文件,而不能找到源代码本身。如果您有任何关于文档的建议或链接,我们将不胜感激。是的,您必

我正在进行一些研究,并希望编辑libstdc++库中的一些源代码以供实验。具体来说,我对试验并行排序算法很感兴趣。有没有一个地方可以让我找到文档来轻松编辑和构建源代码

我尝试过构建libstdc++库的各种版本,但都没有成功。似乎大多数新版本都需要构建整个gcc包,这是一个非常漫长的过程,特别是如果我要在libstdc++中编辑和实验一些文件的话


我也找不到包含并行排序算法的源文件。我似乎只能找到定义函数的头文件,而不能找到源代码本身。如果您有任何关于文档的建议或链接,我们将不胜感激。

是的,您必须构建整个GCC,但一旦构建完成,您只需要重新构建libstdc++部分

有关构建GCC的说明,请参见

libstdc++源代码位于
libstdc++-v3
目录中。并行算法位于
libstdc++-v3/include/parallel
中,它们是模板,因此所有代码都位于标题中。少量非头代码位于
libstdc++-v3/src/c++98/parallel settings.cc


要从顶级build dir重建libstdc++,请进入
$TARGET/libstdc++-v3
目录(其中
$TARGET
类似于
x86_64-unknown-linux-gnu
),然后运行
make
最小分步示例

。压缩命令:

sudo apt-get build-dep gcc
git clone git://gcc.gnu.org/git/gcc.git
cd gcc
git checkout gcc-6_4_0-release
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-languages=c,c++ --prefix="$(pwd)/install"
make -j`nproc`
等待30分钟到两小时。现在让我们使用这个测试程序
a.cpp

#include <cassert>
#include <queue>

int main() {
    std::priority_queue<int> q;
    q.emplace(2);
    q.emplace(1);
    q.emplace(3);
    assert(q.top() == 3);
    q.pop();
    assert(q.top() == 2);
    q.pop();
    assert(q.top() == 1);
    q.pop();
}
现在,让我们整理一下
优先级队列
构造函数

首先,您可以使用GDB轻松找到实际的构造函数,如所述:

所以我们用这个补丁来解决这个问题:

diff --git a/libstdc++-v3/include/bits/stl_queue.h b/libstdc++-v3/include/bits/stl_queue.h
index 5d255e7300b..deec7bc4d99 100644
--- a/libstdc++-v3/include/bits/stl_queue.h
+++ b/libstdc++-v3/include/bits/stl_queue.h
@@ -61,6 +61,7 @@
 #if __cplusplus >= 201103L
 # include <bits/uses_allocator.h>
 #endif
+#include <iostream>

 namespace std _GLIBCXX_VISIBILITY(default)
 {
@@ -444,7 +445,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       priority_queue(const _Compare& __x = _Compare(),
             _Sequence&& __s = _Sequence())
       : c(std::move(__s)), comp(__x)
-      { std::make_heap(c.begin(), c.end(), comp); }
+      {
+        std::cout << "hacked" << std::endl;
+        std::make_heap(c.begin(), c.end(), comp);
+      }

       template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
    explicit
现在是下一次构建和运行:

gcc/build/install/bin/g++ -g -std=c++11 -O0 -o a.out ./a.cpp
./a.out
产出:

hacked
在Ubuntu 16.04上测试

glibc

作为奖励,如果您也对C感兴趣:

gcc/build/install/bin/g++ -g -std=c++11 -O0 -o a.out ./a.cpp
./a.out
hacked