본문 바로가기
Computing technics/GEANT4

gcc 로컬 설치(Without apt)

by 연구실5호 2024. 10. 13.

1.  Prerequisites 프로그램

  • gmp
  • mpfr
  • mpc
  • zlib

  gcc를 설치하기 전 필요한 dependency가 있는 프로그램들이다. 만약 sudo 권한 및 apt 패키지 매니징 프로그램이 있다면 아래 명령어로 다운 받을 수 있다.

$ sudo apt update
$ sudo apt install build-essential libgmp-dev libmpfr-dev libmpc-dev zlib1g-dev

 

  그러나 필요한 경우 local에 직접 소스 코드를 다운받고 설치를 할 수 있다.

 

2.  gmp 설치 (local에서 gcc 설치 시 prerequisites 첫 번째 프로그램)

# GMP Install

$ installDir="<path-to-your-gmp-installation-directory>"

$ if [ ! -f "gmp-6.2.1.tar.bz2" ]; then
$     wget -nc "ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.2.1.tar.bz2"
$ fi
$ tar -xjf "gmp-6.2.1.tar.bz2"
$ cd "gmp-6.2.1" && mkdir -p "build" && cd "build"
$ ../configure --prefix="${installDir}"
$ make -j$(nproc)
$ make install
$ cd .. && rm -rf "build"

 

  위 명령어를 커널에서 실행하면 gmp가 설치된다. build 디렉토리에서 install을 하고자 하는 디렉토리에 prefix를 옵션으로 지정하여 configure를 통해 makefile을 만들고 make 명령어를 통해 설치를 해 준다. 그 후 make install을 통해 설치 생성 파일을 prefix 디렉토리로 옮겨 준다.

 

  참고로 위 명령어들 중 configure를 했을 때 아래와 같은 로그가 뜬다.

configure: summary of build options:

  Version:           GNU MP 6.2.1
  Host type:         skylake-pc-linux-gnu
  ABI:               64
  Install prefix:    <path-to-your-gmp-installation-directory>
  Compiler:          gcc -std=gnu99
  Static libraries:  yes
  Shared libraries:  yes

 

  좀 우스운게 gcc를 설치하기 전 사전 dependancy를 위해 gmp를 설치하는데 compiler로 gcc를 사용한다. 찾아보니 gcc말고 다른 컴파일러로도 컴파일이 가능 하다고 하는데.. 만약 컴파일러가 아예 없다면 뭐든 dependency가 최대한 없는 컴파일러를 하나 찾아 설치해야 하지 않을까 싶다(이전의 gcc는 어쩌면 GNU를 요구하지 않을지도..)
make install까지 마치면 prefix 위치에 아래 디렉토리 목록이 생긴다.

# In the [ <path-to-your-gmp-installation-directory> ]
include  lib  share

 

  include디렉토리 안에는 gmp.h가 있으며 lib디렉토리 안에는  libgmp.a  libgmp.la  libgmp.so  libgmp.so.10  libgmp.so.10.4.1  pkgconfig 가 있다.

 

  설치를 마쳤을 때 이제 다른 프로그램을 컴파일 시 라이브러리 PATH및 헤더 파일 경로, 바이너리 파일 경로를 보편적으로 지정해 주게 되며 gmp또한 그와 같은 환경변수 설정 작업을 해주게 된다.

$ installDir="<path-to-your-gmp-installation-directory>"

$ export PATH="${installDir}/bin${PATH:+:$PATH}"
# 단 path는 gmp의 경우 바이너리 파일이 생성되지 않으므로 이걸 적용할 필요는 없다

$ export LD_LIBRARY_PATH="${installDir}/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
$ export LIBRARY_PATH="${installDir}/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
$ export CPATH="${installDir}/include${CPATH:+:$CPATH}"

echo "PATH : ${PATH}"
echo "LD_LIBRARY_PATH : ${LD_LIBRARY_PATH}"
echo "LIBRARY_PATH : ${LIBRARY_PATH}"
echo "CPATH : ${CPATH}"

  참고로 위 코드에서 ${변수:+값} 구문은 굉장히 중요하다. PATH나 LD_LIBRARY_PATH 같은 경우 보통 기존 변수값이 있지만 CPATH혹은 LIBRARY_PATH는 비어있는 경우가 많기 때문이다. 만약 저 구문 없이 끝에 export LIBRARY_PATH="<library-path>/lib:$LIBRARY_PATH" 와 같은 형식의 문법을 사용하면 기존 변수가 비어있으므로  echo $LIBRARY_PATH를 할 경우 "<library-path>/lib:" 와 같이 끝에 [ : ]으로 경로가 끝나 버릴 수가 있다. 

 

 

  위 환경변수는 설치된 파일 사용, 실행 시 라이브러리 참조, 타 프로그램 컴파일 시 라이브러리 위치, 컴파일 시 헤더 파일 위치 등을 컴파일러에게 알려주는 보편적인 변수 이름들이다.

  • PATH의 경우 보통 install prefix의 bin 디렉토리 아래를 기준 위치로 설정해 준다. 보통 프로그램의 binary가 이 위치에 설치된다.
  • LD_LIBRARY_PATH의 경우 lib디렉토리 아래를 지정해 주며 실행 시 라이브러리를 찾을 때 사용하는 변수다. 이 변수는 컴파일이나 링크 시에는 영향을 미치는 변수가 아니다.
  • LIBRARY_PATH컴파일러가 링크할 때 라이브러리를 찾는 경로다.
  • CPATH의 경우 컴파일러가 헤더 파일을 찾는 경로이다.

  만약 컴파일에 영향을 주는 위 환경변수를 설정하지 않을 경우 컴파일 시 gmp에 의존성이 있는 타 프로그램 설치 시 제대로 설치가 되지 않는다. 혹은 위 방법과 다르게 링킹 등을 해줘야 하는데 보통 옵션으로 아래처럼 적용해 주게 된다.

$ ../configure \
$ LDFLAGS="-L/<path-to-your-gmp-installation-directory>/lib" \
$ CPPFLAGS="-I/<path-to-your-gmp-installation-directory>/include"

  이럴 바엔 그냥 환경 변수 설정을 해주는게 마음이 편하다. 왜냐면 이렇게 gmp에 의존성이 있는 프로램은 추후 실행할 때도 PATH 혹은 ㅣLIBRARY를 요구하기 때문이다.

 

  혹은 패키지 매니저를 통해 flags를 아래처럼 가져올 수 있는 것 같다.

$ export PKG_CONFIG_PATH="<path-to-your-gmp-installation-directory>/lib/pkgconfig:$PKG_CONFIG_PATH"
$ pkg-config --libs --cflags gmp
# 위 명령어를 실행햐면 flag를 출력해서 볼 수 있다

 

  이것을 컴파일을 할 때 아래처럼 사용하는 듯 하다

$ gcc $(pkg-config --cflags --libs gmp) -o 프로그램 프로그램.c

  다만 이것은 어떻게 구체적으로 사용해야 할지 정확하게 모르겠다. 나중에 공부해 보도록 하자.

 

3. mpfr 설치 (local에서 gcc 설치 시 prerequisites 두 번째 프로그램)

  mpfr은 gmp에 dependency가 있으므로 반드시 gmp를 먼저 설치해 주어야 한다. 환경 변수 설정도 제대로 먼저 해 주어야 한다.

# MPFR Install

$ installDir="<path-to-your-MPFR-installation-directory>"

$ if [ ! -f "mpfr-4.1.0.tar.bz2" ]; then
$     wget -nc "ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bz2"
$ fi
$ tar -xjf "mpfr-4.1.0.tar.bz2"
$ cd "mpfr-4.1.0" && mkdir -p "build" && cd "build"
$ ../configure --prefix="${installDir}"
$ make -j$(nproc)
$ make install
$ cd .. && rm -rf "build"

 

  마찬가지로 mpfr설치 이후에도 환경 변수 설정은 다시 설정해 준다.

$ export PATH="${installDir}/bin${PATH:+:$PATH}"
$ export LD_LIBRARY_PATH="${installDir}/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
$ export LIBRARY_PATH="${installDir}/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
$ export CPATH="${installDir}/include${CPATH:+:$CPATH}"

 

4. mpc 설치 (local에서 gcc 설치 시 prerequisites 세 번째 프로그램)

# MPC Install

$ installDir="<path-to-your-MPC-installation-directory>"

$ if [ ! -f "mpc-1.2.1.tar.gz" ]; then
$   wget -nc "ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.2.1.tar.gz"
$ fi
$ tar -xzf "mpc-1.2.1.tar.gz"
$ cd "mpc-1.2.1" && mkdir -p "build" && cd "build"
$ ../configure --prefix="${installDir}"
$ make -j$(nproc)
$ make install
$ cd .. && rm -r "build"

 

  환경 변수 또한 아래처럼 설정해 준다.

$ export PATH="${installDir}/bin${PATH:+:$PATH}"
$ export LD_LIBRARY_PATH="${installDir}/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
$ export LIBRARY_PATH="${installDir}/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
$ export CPATH="${installDir}/include${CPATH:+:$CPATH}"

 

5.  gcc 설치

Official page : https://gcc.gnu.org/

 

GCC, the GNU Compiler Collection - GNU Project

GCC, the GNU Compiler Collection The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, D and Modula-2 as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU oper

gcc.gnu.org

  위 Prerequisites 프로그램 외에도 설치되지 않은 것이 있다면 apt 같은 패키지 매니징 프로그램 혹은 직접 소스 코드 컴파일을 통해 설치한 후 gcc를 설치하면 된다.

이제 본격적으로 gcc를 설치해 보자.

# Installation :
  $ wget https://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz
  $ tar -zxvf "gcc-9.5.0.tar.gz"
  $ cd "gcc-9.5.0" && mkdir -p "build" && cd "build"
  $ ../configure --prefix=${installDir} --disable-multilib

 

  이 때 multilib옵션을 disable 시키는 것에 주목하라. 만약 사용자의 환경이 64 bit만 지원한다면 반드시 해당 옵션을 적용해 주어야 한다. 그렇지 않을 경우 아래와 같은 에러가 발생한다.

collect2: error: ld returned 1 exit status
configure: error: I suspect your system does not have 32-bit development libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.

 

  옵션을 다시 간단히 정리해 주겠다.

  • --enable-languages=c,c++ : c, c++ 관련 컴파일러만 설치 (fortran, java 등과 같은 언어들은 제외됨)
  • --disable-multilib : 32비트 라이브러리 설치 방지
$ export PATH="${installDir}/bin${PATH:+:$PATH}"
$ export LD_LIBRARY_PATH="${installDir}/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
$ export LIBRARY_PATH="${installDir}/lib${LIBRARY_PATH:+:$LIBRARY_PATH}"
$ export CPATH="${installDir}/include${CPATH:+:$CPATH}"

# gcc library is installed at [ lib64 ]
$ export LD_LIBRARY_PATH="${installDir}/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
$ export LIBRARY_PATH="${installDir}/lib64${LIBRARY_PATH:+:$LIBRARY_PATH}"

  특히 위 환경변수 설정에서 중요한 것은 마지막 줄이다. gcc의 경우 --disable-multilib옵션을 사용하여 64비트에 대해서만 설치를 해 주었다. 그 결과 gcc library는 lib64에 관련 라이브러리들이 저장되었다. 따라서 마지막 줄을 통해 관련 라이브러리를 추가해 주어야 한다. 아래에 lib64디렉토리 구성 요소들을 보여 주겠다.

libasan.a           libgfortran.so.5      liblsan_preinit.o     libstdc++.la
libasan.la          libgfortran.so.5.0.0  libobjc.a             libstdc++.so
libasan.so          libgfortran.spec      libobjc.la            libstdc++.so.6
libasan.so.5        libgomp.a             libobjc.so            libstdc++.so.6.0.28
libasan.so.5.0.0    libgomp.la            libobjc.so.4          libstdc++.so.6.0.28-gdb.py
libasan_preinit.o   libgomp.so            libobjc.so.4.0.0      libstdc++fs.a
libatomic.a         libgomp.so.1          libquadmath.a         libstdc++fs.la
libatomic.la        libgomp.so.1.0.0      libquadmath.la        libsupc++.a
libatomic.so        libgomp.spec          libquadmath.so        libsupc++.la
libatomic.so.1      libitm.a              libquadmath.so.0      libtsan.a
libatomic.so.1.2.0  libitm.la             libquadmath.so.0.0.0  libtsan.la
libcc1.la           libitm.so             libsanitizer.spec     libtsan.so
libcc1.so           libitm.so.1           libssp.a              libtsan.so.0
libcc1.so.0         libitm.so.1.0.0       libssp.la             libtsan.so.0.0.0
libcc1.so.0.0.0     libitm.spec           libssp.so             libtsan_preinit.o
libgcc_s.so         liblsan.a             libssp.so.0           libubsan.a
libgcc_s.so.1       liblsan.la            libssp.so.0.0.0       libubsan.la
libgfortran.a       liblsan.so            libssp_nonshared.a    libubsan.so
libgfortran.la      liblsan.so.0          libssp_nonshared.la   libubsan.so.1
libgfortran.so      liblsan.so.0.0.0      libstdc++.a           libubsan.so.1.0.0

 

  한 가지 예로 만약 lib64를 LIBRARY_PATH에 추가해주지 않는다면 CMake 같은 컴파일 시 gcc를 사용하는 프로그램의 경우 아래처럼 에러가 발생할 수도 있다.

lib64/libstdc++.so.6: version GLIBCXX_3.4.26' not found

 

6. 설치 확인

  최종적으로 위처럼 환경 변수를 설정한 후 gcc --version을 통해 gcc가 맞는 버전으로 설치되었는지 그리고 which gcc를 통해 제대로 prefix 위치에 설치 되었는지 확인한다.

$ gcc --version
gcc (GCC) 9.5.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which gcc
~/SoftWare/install/bin/gcc