공유 라이브러리없이 GMP, MPFR, MPC, ELF를 사용하여 GCC를 하나씩 설치하는 방법은 무엇입니까?


115


패키지 관리자 (예 : yum, rpm, apt, dpkg)를 사용하지 않고 공유 라이브러리를 사용하지 않고 현재 버전을 사용하고 올바른 버전의 종속성을 사용하여 GCC (GNU 컴파일러 컬렉션)를 하나씩 설치하려면 어떻게해야 합니까?

일반적인 개발자는 일반적인 방법으로 GCC를 설치하거나 패키지 관리자 (yum, rpm, apt, dpkg, port, brew 등)를 사용하거나 여기의 지침 ( http://gcc.gnu.org/wiki/ )을 따르기를 원할 것입니다. GCC 설치 ).

제 질문은 공유 라이브러리없이 GCC를 하나씩 설치하는 방법입니다.

  • 공유 라이브러리를 사용하지 않고 공유 라이브러리를 만들지 않고도 내 시스템에서 이동할 수있는 완전히 독립적 인 GCC를 원합니다.
  • 이것은 GCC가 "어려운 방법"이라고 부르는 것이며 일반 사용자에게는 권장되지 않습니다.

GCC는 다음에 의존합니다.

  • GMP : GNU 다중 정밀도 산술 라이브러리
  • MPFR : GNU 다중 정밀도 부동 소수점 반올림 라이브러리
  • MPC : GNU 다중 정밀도 C 라이브러리
  • ELF : 실행 가능 및 연결 가능 형식 라이브러리
  • PPL : Parma Polyhedra Library (옵션, 메모리 최적화 용)

답변:


123

쉬운 방법

일반적인 개발자라면 http://gcc.gnu.org/wiki/InstallingGCC의 지침 이나 다음과 같은 시스템 패키지 관리자를 사용하여 쉬운 방법으로 설치할 수 있습니다 .

apt  install gcc  # for Debian, Ubuntu, etc.
yum  install gcc  # for RedHat, CentOS, etc.
brew install gcc  # for Mac OS X

어려운 방법

GCC는 여기에서 답이 "어려운 방법"이라고 말합니다. 왜냐하면 모든 것을 부분적으로 만들고 공유 라이브러리를 사용하지 않기 때문입니다.

GCC 인프라

GCC 인프라 얻기 :

ftp://gcc.gnu.org/pub/gcc/infrastructure/

임시 디렉토리에 다운로드를 저장합니다 (원하는 디렉토리를 사용할 수 있음).

/opt/downloads

downloads 디렉터리 또는 하위 디렉터리와 다른 임시 디렉터리에 인프라를 빌드합니다.

/tmp/gcc

다음과 같은 정적 라이브러리를 사용하여 인프라를 구성하십시오.

./configure --disable-shared --enable-static --prefix=/tmp/gcc

--disable-shared 플래그는 필요에 따라 자세히 살펴볼 가치가 있습니다. 정적 코드 만 빌드하고 있기 때문에 --disable-shared를 사용하고 공유 코드를 빌드하지 않았는지 확인하고 싶습니다. 내 필요는 결과 GCC를 내 드라이브에서 쉽게 이동하는 것이므로 모든 정적 코드를 원하고 공유 코드를 원하지 않습니다. 공유 코드를 선호하는 경우 --disable-shared 플래그를 생략하십시오.

버전

이 답변의 명령 중 하나를 실행할 때 필요에 맞는 현재 GCC 버전 번호를 사용하도록 명령을 업데이트하십시오. 이 답변의 명령은 GCC 4.6.2 용입니다.

GCC 문서에는 "충분히 새로운 버전의 필수 도구가 일반적으로 작동하지만 라이브러리 요구 사항은 일반적으로 더 엄격합니다. 경우에 따라 새 버전이 작동 할 수 있지만 문서화 된 정확한 버전을 사용하는 것이 더 안전합니다."

GMP

GMP는 GNU 다중 정밀도 산술 라이브러리입니다.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
bunzip2 gmp-4.3.2.tar.bz2
tar xvf gmp-4.3.2.tar
cd gmp-4.3.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

MPFR

MPFR은 GNU 다중 정밀도 부동 소수점 반올림 라이브러리입니다. GMP에 따라 다릅니다.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
bunzip2 mpfr-2.4.2.tar.bz2
tar xvf mpfr-2.4.2.tar
cd mpfr-2.4.2
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc
make && make check && make install

MPC

MPC는 GNU 다중 정밀도 C 라이브러리입니다. GMP 및 MPFR에 따라 다릅니다.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
tar zxvf mpc-0.8.1.tar.gz
cd mpc-0.8.1
./configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc
make && make check && make install

꼬마 요정

ELF는 실행 가능 및 링크 가능 형식을 나타냅니다. 이 라이브러리는 아키텍처 독립적 인 크기와 엔디안 지원을 제공합니다.

wget http://www.mr511.de/software/libelf-0.8.13.tar.gz
tar zxvf libelf-0.8.13.tar.gz
cd libelf-0.8.13
./configure --disable-shared --enable-static --prefix=/tmp/gcc
make && make check && make install

GCC

GCC는 GNU 컴파일러 컬렉션입니다. GMP, MPFR, MPC 및 ELF에 따라 다릅니다.

wget http://www.netgull.com/gcc/releases/gcc-4.6.2/gcc-4.6.2.tar.gz
tar zxvf gcc-4.6.2.tar.gz

동일한 마운트 지점의 스크래치 디렉토리에 gcc를 빌드하십시오. (/ tmp 내에서 빌드하면 크로스 컴파일 호스트 문제가 발생합니다)

mkdir -p /opt/downloads/gcc-4.6.2-scratch
cd /opt/downloads/gcc-4.6.2-scratch

configure 명령과 플래그는 모두 하나의 명령 줄에 있어야합니다 (이 게시물은 웹 페이지 너비 때문에 별도의 줄에 표시됨).

참고 : 전체 경로를 사용하여 라이브러리 경로 환경 변수를 구성하고 설정하지 않습니다. 우리는 부트 스트랩을 비활성화하고 공유 라이브러리를 비활성화하기로 선택합니다 (일반 사용자는 둘 다 원할 수 있음), posix 스레드를 사용하고 우리가 원하기 때문에 기본값 인 플래그를 지정합니다 (일반 사용자는 다른 스레드를 사용하거나 건너 뛰기를 원할 수 있음). 기본 플래그). YMMV 및 여기 에서 플래그에 대해 읽으 십시오.

/opt/downloads/gcc-4.6.2/configure
  --disable-shared
  --disable-bootstrap
  --disable-libstdcxx-pch
  --enable-languages=all
  --enable-libgomp
  --enable-lto
  --enable-threads=posix
  --enable-tls
  --with-gmp=/tmp/gcc
  --with-mpfr=/tmp/gcc
  --with-mpc=/tmp/gcc
  --with-libelf=/tmp/gcc
  --with-fpmath=sse
make && make install

이 페이지는 GCC 설치 정보, 빌드 방법, 다양한 플래그 등에 유용합니다.

http://www.acsu.buffalo.edu/~charngda/cc_build.html

업데이트

ppl 라이브러리는 메모리 최적화에 사용할 수 있습니다. bugseng.com/products/ppl/Download를 참조하십시오 (댓글에 Paul에게 감사드립니다)

gcc 소스 디렉토리에서 ./contrib/download_prerequisites를 실행할 수 있습니다. (reddit의 N7P에 감사드립니다)


2
참고로 새로운 GCC 4.6.3에 대해 위의 버전 번호를 업데이트해야합니다 (또는 무엇이든 당신이이 일을 할 때 현재의)
joelparkerhenderson

12
gcc 소스 디렉토리에서 ./contrib/download_prerequisites를 실행할 수 있습니다. 이 의견은 Reddit의 N7P 덕분입니다.
joelparkerhenderson

3
아니요, 부트 스트랩은 그것에 의존하지 않습니다. GMP, MPFR 및 MPC 빌드에는 --disable-shared를 사용하지만 GCC 자체에는 사용하지 않는 것이 좋습니다 (그리고 download_prerequisites 스크립트를 사용하면 어쨌든 수동으로 GMP, MPFR 및 MPC를 빌드 할 필요가 없음). GCC 빌드 는 기본적으로 항상 정적 라이브러리 공유 라이브러리를 빌드합니다 . --disable-shared는 대부분의 사람들에게 잘못된 선택 인 공유 라이브러리가 없음을 의미합니다.
Jonathan Wakely는

8
--disable-shared대부분의 사람들에게 잘못되어 --disable-bootstrap빌드 속도를 높일 수 있지만 기존 gcc 버전에 따라 실패 할 수 있습니다. --enable-libgomp어쨌든 기본적으로 --enable-lto활성화되어 있으며 기본적으로 활성화되어 --enable-thread-safe있으며 유효한 옵션이 아님, --enable-threads=posix일부 플랫폼에서는 기본적으로 활성화되어 있고 다른 플랫폼에서는 유효하지 않습니다. , --enable-tls기본적으로 활성화 ... 기본적으로이 지침은 매우 가난
조나단 Wakely

1
Linuxbrew를 사용하여 홈 디렉토리에 gcc (및 선택적으로 glibc)를 설치할 수 있습니다 brew install gcc. 참조 linuxbrew.sh
숀 잭맨에게

118

허용되는 대답은 필요 이상으로 훨씬 더 복잡하게 만들고 모든 버전에 대해 정확하지 않습니다. GCC를 빌드하는 --disable-shared것은 일반적으로 매우 나쁜 생각입니다. 더 쉬운 접근 방법 은 http://gcc.gnu.org/wiki/InstallingGCC 를 참조하십시오 .

전체 과정은 (당신이 구축하려는 버전 4.6.2 교체)이보다 더 어려울 수 없어야한다 :

tar xzf gcc-4.6.2.tar.gz
cd gcc-4.6.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.6.2/configure --prefix=$HOME/GCC-4.6.2 
make
make install

(하지만 위의 링크는 유용한 정보를 담고 있습니다.)

분명히 Ubuntu의 일부 사람들은 GCC 빌드 프로세스를 방해하는 환경에 수많은 쓰레기가 있으며 먼저 제거해야합니다.

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH

2
아니요, 누락 된 단계가 없습니다
Jonathan Wakely

2
@ user2023370, GCC는 물론 모든 자체 헤더와 라이브러리를 찾는 방법을 알고 있습니다. 동적 링커에 라이브러리를 찾는 방법을 알려주려면 LD_LIBRARY_PATH를 설정해야합니다 (실행 가능한 GCC를 실행할 때 더 이상 관련되지 않기 때문). gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely를

2
@einpoklum, 당신의 "이런 것"은 같지 않았습니다. 위의 단계가 작동합니다. 모든 버전의 GCC에서 정기적으로 작동합니다. 수백 명의 사람들을 위해 일합니다.
Jonathan Wakely 2015

3
향후 참조를 위해 이것은 gcc-5.4.0에서 저에게 효과적이었습니다. 언급되지 않은 유일한 것은 unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH여기에 제안 된 다른 모든 것보다 먼저 해야했다는 것입니다. stackoverflow.com/questions/12255058/…
Cantfindname

4
이것은 gcc 6.2.0에서 나를 위해 일했으며 확실히 받아 들여지는 대답이어야합니다! (이 등, 운영 체제 / 버전에서 작동)
데이비드 도리아

25

나는 클러스터에서 작업합니다. 마스터 노드 만 인터넷에 연결됩니다. 노드의 소프트웨어는 오래되어 일반적으로 유지되지 않습니다. 루트 액세스 권한이 없습니다. 두 가지 옵션이 있습니다.

  • 필요한 정적 소프트웨어 (컴퓨팅 패키지)를 빌드합니다. 또는
  • 정적 컴파일러를 빌드하십시오.

두 번째를 선택하고 gcc, g ++ 및 gfortran을 빌드했습니다.

나는 모든 것을 내장했다

PREFIX=$HOME/cmp/soft/sft

그리고 make내가 사용

THREADS=8

아래에서 gcc는

  • GMP
  • MPFR
  • MPC
  • ISL
  • CLOOG

여기에서 최신 gcc를 얻을 수 있습니다 : ftp://gcc.gnu.org/pub/gcc/releases

종속성은 ftp://gcc.gnu.org/pub/gcc/infrastructure 에서 찾을 수 있습니다.

의존성

다음 스크립트로 종속성을 얻습니다.

#!/bin/sh

# ===========
## variables:

GMP=gmp-4.3.2.tar.bz2
MPFR=mpfr-2.4.2.tar.bz2
MPC=mpc-0.8.1.tar.gz
ISL=isl-0.12.2.tar.bz2
CLOOG=cloog-0.18.1.tar.gz

MIRROR=ftp://gcc.gnu.org/pub/gcc/infrastructure


# ===========
## functions:

extract() {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)   tar xvjf $1    ;;
            *.tar.gz)    tar xvzf $1    ;;
            *.bz2)       bunzip2 $1     ;;
            *.rar)       unrar x $1     ;;
            *.gz)        gunzip $1      ;;
            *.tar)       tar xvf $1     ;;
            *.tbz2)      tar xvjf $1    ;;
            *.tgz)       tar xvzf $1    ;;
            *.zip)       unzip $1       ;;
            *.Z)         uncompress $1  ;;
            *.7z)        7z x $1        ;;
            *)           echo "I don't know how to extract '$1'..." ;;
        esac
    else
        echo "'$1' is not a valid file!"
    fi
}

# ======================
## download and extract:

wget $MIRROR/$GMP
extract $GMP

wget $MIRROR/$MPFR
extract $MPFR

wget $MIRROR/$MPC
extract $MPC

wget $MIRROR/$ISL
extract $ISL

wget $MIRROR/$CLOOG
extract $CLOOG

다음 bash 함수가 아래에 사용됩니다.

mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }

아래의 각 명령은 방금 다운로드 한 lib의 dir에서 실행됩니다.

GMP

mkdircd build
../configure --disable-shared --enable-static --prefix=$PREFIX/gmp
make -j $THREADS && make check && make install

MPFR

mkdircd build
../configure --with-gmp=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/mpfr
make -j $THREADS && make install

MPC

mkdircd build
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --disable-shared --enable-static --prefix=$PREFIX/mpc
make -j $THREADS && make install

ISL

mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --disable-shared --enable-static --prefix=$PREFIX/isl
make -j $THREADS && make install

CLOOG

mkdircd build
../configure --with-gmp-prefix=$PREFIX/gmp --with-isl-prefix=$PREFIX/isl --disable-shared --enable-static --prefix=$PREFIX/cloog
make -j $THREADS && make install

gcc

mkdircd build
export LD_LIBRARY_PATH=$PREFIX/gmp/lib:$PREFIX/mpfr/lib:$PREFIX/mpc/lib:$PREFIX/isl/lib:$PREFIX/cloog/lib
export C_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
export CPLUS_INCLUDE_PATH=$PREFIX/gmp/include:$PREFIX/mpfr/include:$PREFIX/mpc/include:$PREFIX/isl/include:$PREFIX/cloog/include
../configure --with-gmp=$PREFIX/gmp --with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --with-cloog=$PREFIX/cloog --disable-shared --enable-static --disable-multilib --prefix=$PREFIX/gcc --enable-languages=c,c++,fortran
make -j $THREADS bootstrap && make install

1
이것은 불필요하게 복잡하며, 내 대답 의 단계는 루트 액세스없이 정적으로 연결된 GCC를 빌드하며 LD_LIBRARY_PATH결과 GCC를 사용 하도록 설정할 필요가 없습니다 .
Jonathan Wakely

이것은 "잘 정의 된"경로에 설치된 것과 충돌하는 상황에서도 작동합니다 (즉, 표준 절차가 완전히 작동하지 않는 경우). 2017-06-19 기준 최신 버전 : gmp-6.1.2 mpfr-3.1.5 mpc-1.0.3 isl-0.16.1 cloog-0.18.4 gcc-7.1.0
Michael Goldshteyn

7

내가 수동으로 gmp와 mpfr을 다운로드하고 소프트 링크를 만들어야한다는 점을 제외하고는 위에서 Jonathan이 언급 한 것을 사용했습니다 (gcc 4.4.2 배포판에는 "download_prerequisites"가 없을 것입니다)

cd src/gcc-4.4.2
ln -s ~/linux64/gmp-4.2.1  gmp
ln -s ~/linux64/mpfr-2.3.0 mpfr

Btw, "-with-gmp"및 "with-mpfr"을 "./configure"와 함께 사용하면 "configure : error : cannot compute suffix of object files : cannot compile"이 발생했습니다. 따라서 gmp 및 mpfr의 srcs를 다운로드 한 다음 gcc src top leve dir 내에서 소프트 링크를 만들었습니다.


2

GMP, MPFRMPC를 포함한 GCC 종속성 설치를 시도한 후 . 추가 설치 요구 사항, 오류 및 누락 된 파일이 발생했습니다. MPFR이 설치하는 데 필요한 gmp.h 헤더 파일과 같은. 그 과정에서 직면하게 될 많은 문제가 있습니다. 그러나 빌드하고 설치하는 쉬운 방법이있다 GCC-X.0.0 또는 나중에 와 버전을 자동 연결 .

옵션 1.

make로 빌드하는 문제를 해결하려면 동적 라이브러리를 설치하고 연결하기 만하면됩니다.

  • GCC-X.0.0 버전을 다운로드하십시오 (최신 버전 : https://gcc.gnu.org/ ).

  • gcc-X-000.tar.gz 파일을 / somepath / 위치에 추출하십시오.

  • .tar.gz 파일을 추출했으면 / somepath / 또는 소스 디렉토리에있는 ./contrib/download_prerequisites 스크립트를 실행 하십시오 .

  • 이 스크립트는 GMP, MPFRMPC를 포함한 지원 라이브러리를 다운로드 하고 gcc 설치 프로세스의 일부로 모든 gcc 종속성을 자동으로 빌드 하는 Symlink생성 합니다 .

    Make, Make Install을 실행하거나 ./configure 파일을 실행 하거나 --with-gmp = / gmp_path / ... / .....와 같은 링크를 추가 하여 / somepath /에 다운로드 된 라이브러리를 빌드 및 링크 할 필요가 없습니다 . , --with-mpfr = / mpfr_path / ... / ... 심볼릭 링크 를 생성 한 스크립트를 실행할 때 수행 되었기 때문 입니다.

옵션 2 :

  • OS 패키지 관리 시스템을 사용하여 표준 시스템 위치에 지원 라이브러리를 설치합니다. Ubuntu를 포함한 Debian 기반 시스템의 경우 libgmp-dev, libmpfr-devlibmpc-dev 패키지를 설치합니다. Fedora 및 SUSE를 포함한 RPM 기반 시스템의 경우 gmp-devellibmpc-devel ( SUSE의 mpc-devel ) 패키지를 설치합니다.
  • 이 옵션은 GCC를 빌드 할 때 자동으로 발견되는 표준 시스템 디렉토리에 라이브러리와 헤더 파일을 설치합니다.
  • 이것은 "sudo apt-get install libgmp-dev" 또는 "sudo apt-get install libmpfr-dev" 설치를 호출 하고 링크가 자동으로 수행 될 때 OS 패키지 설치 관리의 장점입니다 . 또한 Make, Make install 또는 ./configure 를 사용하여 지원 라이브러리를 빌드 할 필요가 없습니다 . 또한 모든 프로세스를 완료하는 데 몇 분 정도 걸립니다.
  • 이제 GCC 설치를 계속할 수 있습니다.

구성 :

This is the GCC config Process, with gcc-X-000.tar.gz 

발행물:

tar -xvf gcc-X-000.tar.gz 
cd gcc-X-000
./contrib/download_prerequisites
cd ..
mkdir objdir
/../gcc-X-000/configure --prefix=$HOME/gcc-X-000 --enable-languages=c,c++,fortran,go --disable-multilib
make -j 2
make install

주의 :

--c ++ 또는 c와 같은 언어를 활성화합니다 .

--disable-multilib ; 시스템 및 OS에 따라 multilib를 비활성화하면 계속 진행하려면 multilib에 대한 메시지가 표시됩니다.

완료하는 데 오랜 시간이 걸립니다. 그러나 -j #no_pro 옵션을 실행할 수 있습니다. 그러면 PC 또는 Mac의 프로세서 수에 따라 동시에 Make가 동시에 실행됩니다.

이 프로세스를 실행하는 방법에 대한 자세한 정보는 https://gcc.gnu.org/wiki/InstallingGCC를 방문 하십시오 .


1

나는 joelparkerhenderson의 최고 답변을 따랐습니다. 이것은 인터넷을 통해 * NIX 시스템에 설치할 때 찾을 수있는 가장 좋은 대답입니다.

후손을 위해 "설치 오류 : 개체 파일의 접미사를 계산할 수 없음 : 컴파일 할 수 없음"과 같은 오류가 발생하면 추가하고 싶습니다.

그런 다음 LD_LIBRBARY_PATH를 / tmp / gcc / lib로 업데이트하십시오 (컨텍스트에 대한 joelparkerhenderson의 전체 답변 참조)

/ tmp / gcc / lib에는 필요한 모든 mpfr / mpc / gmp 파일이 포함되어 있으므로 LD_LIBRARY_PATH에 추가하지 않으면 런타임 링커가 파일을 찾을 수 없습니다. 또한 LD_LIBRARY_PATH를 내보내는 것을 잊지 마십시오.). 자세한 내용은 https://gcc.gnu.org/wiki/FAQ#configure_suffix를 참조하세요.


컴파일러를 사용하기 위해 LD_LIBRARY_PATH를 업데이트하는 것은 어리석은 일입니다. 당신이 사용하는 경우 stackoverflow.com/a/10662297/981959을 대신에 필요하지 않습니다.
Jonathan Wakely 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.