특정 컴파일러 옵션을 사용하여 libstdc++를 컴파일하는 방법은 무엇입니까?

특정 컴파일러 옵션을 사용하여 libstdc++를 컴파일하는 방법은 무엇입니까?

가능하다면 프로파일링 목적으로 옵션을 사용하여 libstdc++를 컴파일하고 싶습니다 -fno-omit-frame-pointer. 다음을 통해 libstdc++를 빌드할 수 있었습니다.https://gcc.gnu.org/install/index.html, 그런데 이 옵션을 어떻게 설정하나요? 이 CXXFLAGS접근 방식은 작동하지 않았습니다.

답변1

힌트https://www.linuxfromscratch.org/lfs/view/stable/chapter06/gcc-pass2.html

테스트 빌드....

tar xvf gcc-10.3.0.tar.xz
mkdir BUILD__libstdc++103
cd BUILD__libstdc++103/

../gcc-10.3.0/libstdc++-v3/configure \
    CXXFLAGS="-g -O2 -D_GNU_SOURCE -fno-omit-frame-pointer" \
    --prefix=/home/knudfl/BUILD__libstdc++103/usr \
    --disable-multilib --disable-libstdcxx-pch 

make
make install

문제가 없는 것 같습니다. 텍스트가 -fno-omit-frame-pointer터미널 출력에 표시됩니다 make.

답변2

최소한의 단계별 예

소스에서 GCC 컴파일. 단순화된 명령:

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분에서 2시간 정도 기다리세요. 이제 이 테스트 프로그램을 사용해 보겠습니다 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();
}

먼저 컴파일하고 실행하여 초기 컴파일이 작동하는지 확인하세요.

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

priority_queue이제 생성자를 수정해 보겠습니다 .

먼저, 다음과 같이 GDB를 사용하여 실제 생성자를 쉽게 찾을 수 있습니다.https://stackoverflow.com/questions/11266360/when-should-i-use-make-heap-vs-priority-queue/51945521#51945521

그래서 우리는 이 패치를 통해 이 문제를 해결했습니다.

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

그런 다음 libstdc++를 다시 빌드하고 다시 설치하여 많은 시간을 절약하십시오.

cd gcc/build/x86_64-pc-linux-gnu/libstdc++-v3
make -j`nproc`
make install

이제 다음 빌드 및 실행:

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

산출:

hacked

우분투 16.04에서 테스트되었습니다.

glibc

보너스로, C에도 관심이 있다면:https://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host/52454603#52454603

관련된:

관련 정보