Làm cách nào để cài đặt GCC từng mảnh với GMP, MPFR, MPC, ELF mà không cần thư viện dùng chung?


115

Làm cách nào để cài đặt từng mảnh GCC (Bộ sưu tập trình biên dịch GNU), sử dụng phiên bản hiện tại,
sử dụng các phiên bản phụ thuộc chính xác, không sử dụng trình quản lý gói (như yum, rpm, apt, dpkg) và không sử dụng các thư viện dùng chung?

Các nhà phát triển điển hình có thể muốn cài đặt GCC theo cách thông thường, sử dụng trình quản lý gói của bạn (yum, rpm, apt, dpkg, port, brew, v.v.) hoặc làm theo hướng dẫn tại đây ( http://gcc.gnu.org/wiki/ Cài đặtGCC ).

Câu hỏi của tôi là làm thế nào để cài đặt GCC từng mảnh, mà không cần thư viện chia sẻ.

  • Tôi muốn một GCC độc lập hoàn toàn có thể được di chuyển xung quanh hệ thống của tôi mà không cần sử dụng bất kỳ thư viện chia sẻ nào và không tạo bất kỳ thư viện chia sẻ nào.
  • Đây là điều mà GCC gọi là "cách khó khăn" và nó không được khuyến nghị cho người dùng thông thường.

GCC phụ thuộc vào:

  • GMP: GNU Nhiều thư viện số học chính xác
  • MPFR: Thư viện làm tròn điểm chính xác GNU
  • MPC: Thư viện C đa chính xác GNU
  • ELF: Thư viện định dạng có thể thực thi và liên kết
  • PPL: Thư viện đa diện Parma (tùy chọn, để tối ưu hóa bộ nhớ)

Câu trả lời:


123

Cách dễ dàng

Nếu bạn là nhà phát triển điển hình, bạn có thể cài đặt một cách dễ dàng, sử dụng các hướng dẫn tại http://gcc.gnu.org/wiki/InstallingGCC hoặc trình quản lý gói hệ thống của bạn, chẳng hạn như:

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

Con đường gian nan

GCC cho biết câu trả lời ở đây là "một cách khó khăn" bởi vì nó xây dựng mọi thứ từng mảnh một và không sử dụng các thư viện chia sẻ.

Cơ sở hạ tầng GCC

Nhận cơ sở hạ tầng GCC:

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

Đặt tải xuống trong một thư mục tạm thời (bạn có thể sử dụng bất kỳ thư mục nào bạn muốn).

/opt/downloads

Xây dựng cơ sở hạ tầng trong thư mục tạm thời khác với thư mục tải xuống hoặc thư mục con của nó:

/tmp/gcc

Định cấu hình cơ sở hạ tầng bằng các thư viện tĩnh như thế này:

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

Cờ --disable-shared có thể đáng xem kỹ hơn tùy theo nhu cầu của bạn. Tôi sử dụng --disable-shared vì tôi chỉ xây dựng mã tĩnh và tôi muốn đảm bảo rằng tôi không xây dựng bất kỳ mã chia sẻ nào. Nhu cầu của tôi là di chuyển GCC kết quả xung quanh các ổ đĩa của tôi một cách dễ dàng, vì vậy tôi muốn tất cả mã tĩnh và tôi không muốn bất kỳ mã chia sẻ nào. Nếu bạn thích mã được chia sẻ, hãy bỏ qua cờ --disable-shared.

Phiên bản

Khi bạn chạy bất kỳ lệnh nào trong câu trả lời này, hãy nhớ cập nhật các lệnh để sử dụng số phiên bản GCC hiện tại phù hợp với nhu cầu của bạn. Các lệnh trong câu trả lời này là dành cho GCC 4.6.2.

Lưu ý rằng tài liệu GCC cho biết: "Mặc dù mọi phiên bản mới của các công cụ cần thiết thường hoạt động, các yêu cầu thư viện thường nghiêm ngặt hơn. Các phiên bản mới hơn có thể hoạt động trong một số trường hợp, nhưng an toàn hơn khi sử dụng các phiên bản chính xác được ghi lại."

GMP

GMP là Thư viện Số học Chính xác 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 là thư viện làm tròn điểm chính xác GNU. Nó phụ thuộc vào 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 là thư viện C nhiều độ chính xác của GNU. Nó phụ thuộc vào GMP và 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

ELF là viết tắt của định dạng thực thi và liên kết. Thư viện này cung cấp kích thước độc lập với kiến ​​trúc và hỗ trợ về cuối.

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 là Bộ sưu tập Trình biên dịch GNU. Nó phụ thuộc vào GMP, MPFR, MPC và 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

Xây dựng gcc trong một thư mục đầu trên cùng một điểm gắn kết. (Xây dựng nó trong / tmp sẽ kích hoạt các vấn đề máy chủ biên dịch chéo)

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

Lệnh configure và các cờ của nó phải nằm trên một dòng lệnh (bài đăng này hiển thị chúng trên các dòng riêng biệt chỉ vì độ rộng của trang web).

Lưu ý: Chúng tôi sử dụng đường dẫn đầy đủ để định cấu hình và không đặt biến môi trường đường dẫn thư viện. Chúng tôi chọn tắt bootstrap và vô hiệu hóa các thư viện dùng chung vì chúng tôi không muốn chúng (người dùng thông thường có thể muốn cả hai) và sử dụng các luồng posix và gắn cờ mặc định vì chúng tôi muốn chúng (người dùng thông thường có thể muốn sử dụng các luồng khác hoặc bỏ qua cờ mặc định). YMMV và đọc về các cờ ở đây

/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

Trang này rất phù hợp với thông tin cài đặt GCC, cách xây dựng nó, nhiều cờ khác nhau và hơn thế nữa:

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

Cập nhật

Các thư viện ppl có thể được sử dụng để tối ưu hóa bộ nhớ: xem bugseng.com/products/ppl/D Download (Cảm ơn Paul trong phần bình luận)

Bạn có thể chạy ./contrib/doad_prerequisites từ thư mục nguồn gcc. (Cảm ơn N7P trên reddit)


2
FYI chắc chắn cập nhật số phiên bản trên cho GCC 4.6.3 mới (hoặc bất cứ điều gì hiện tại khi bạn đang làm điều này)
joelparkerhenderson

12
Bạn có thể chạy ./contrib/doad_prerequisites từ thư mục nguồn gcc. Nhận xét này là nhờ N7P trên Reddit.
joelparkerhenderson

3
Không, bootstrapping không phụ thuộc vào nó. Thật hợp lý khi sử dụng --disable-shared để xây dựng GMP, MPFR và MPC nhưng không phải cho chính GCC (và sử dụng tập lệnh download_prerequisites có nghĩa là bạn không cần phải xây dựng thủ công theo tiêu chuẩn GMP, MPFR và MPC). Xây dựng GCC luôn xây dựng các lib tĩnh chia sẻ lib theo mặc định, --disable-shared chỉ có nghĩa là bạn không nhận được các lib chung, đây là lựa chọn sai cho hầu hết mọi người.
Jonathan Wakely

8
--disable-sharedHầu hết mọi người đều sai, --disable-bootstrapcó thể tăng tốc độ xây dựng, nhưng có thể khiến nó bị lỗi tùy thuộc vào phiên bản gcc hiện có, --enable-libgompđược bật theo mặc định, --enable-ltođược bật theo mặc định, --enable-thread-safekhông phải là tùy chọn hợp lệ, --enable-threads=posixđược bật theo mặc định trên một số nền tảng, không hợp lệ trên các nền tảng khác , --enable-tlsđược bật theo mặc định, ... về cơ bản các hướng dẫn này khá kém
Jonathan Wakely

1
Bạn có thể sử dụng Linuxbrew để cài đặt gcc (và tùy chọn glibc) trong thư mục chính của bạn với brew install gcc. Xem linuxbrew.sh
Shaun Jackman

118

Câu trả lời được chấp nhận làm cho nó xa hơn phức tạp hơn mức cần thiết và không đúng cho tất cả các phiên bản. Xây dựng GCC với --disable-sharedthường là một ý tưởng rất xấu. Xem http://gcc.gnu.org/wiki/InstallingGCC để biết cách tiếp cận dễ dàng hơn.

Các toàn bộ quá trình nên có nhiều khó khăn hơn thế này (thay thế 4.6.2 với phiên bản mà bạn muốn xây dựng):

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

(Nhưng vui lòng đọc liên kết ở trên dù sao, nó chứa thông tin hữu ích.)

Rõ ràng, một số người trên Ubuntu có hàng tấn rác rưởi trong môi trường của họ gây cản trở quá trình xây dựng GCC và trước tiên họ cần phải loại bỏ điều đó:

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH

2
Không, không có bước thiếu
Jonathan Wakely 29/12/13

2
@ user2023370, GCC biết cách tìm tất cả các tiêu đề và thư viện của riêng mình, tất nhiên. Bạn cần đặt LD_LIBRARY_PATH để cho trình liên kết động biết cách tìm các thư viện (vì khi bạn chạy GCC thực thi không còn liên quan nữa), hãy xem gcc.gnu.org/onlinesocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan

2
@einpoklum, thì "cái gì đó như thế này" của bạn không giống nhau. Các bước trên làm việc. Họ làm việc cho tôi thường xuyên, với tất cả các phiên bản GCC. Họ làm việc cho hàng trăm người.
Jonathan Wakely

3
Để tham khảo trong tương lai, điều này làm việc cho tôi cho gcc-5.4.0. Điều duy nhất không được đề cập là tôi phải làm unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATHtrước mọi thứ khác như được đề xuất ở đây: stackoverflow.com/questions/12255058/
mẹo

4
Điều này làm việc cho tôi với gcc 6.2.0 và chắc chắn sẽ là câu trả lời được chấp nhận! (Nó hoạt động trên các hệ điều hành / phiên bản, v.v.)
David Doria

25

Tôi làm việc trên một cụm. Chỉ có nút chủ được kết nối với Internet. Phần mềm trên các nút đã lỗi thời và thường không được bảo trì. Tôi không có quyền truy cập root. Tôi có hai lựa chọn:

  • xây dựng phần mềm tĩnh tôi cần (gói tính toán); hoặc là
  • xây dựng trình biên dịch tĩnh.

Tôi đã chọn gcc, g ++ và gfortran thứ hai và được xây dựng.

Tôi đã xây dựng mọi thứ trong

PREFIX=$HOME/cmp/soft/sft

và cho maketôi đã sử dụng

THREADS=8

Dưới đây, gcc được xây dựng với

  • GMP
  • MPFR
  • MPC
  • ISL
  • YÊU CẦU

Người ta có thể nhận được gcc mới nhất từ ​​đây: ftp://gcc.gnu.org/pub/gcc/release

Sự phụ thuộc được tìm thấy ở đây: ftp://gcc.gnu.org/pub/gcc/infr Hạ tầng

Phụ thuộc

Tôi nhận được phụ thuộc với tập lệnh sau:

#!/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

Hàm bash sau được sử dụng dưới đây:

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

Mỗi lệnh dưới đây sẽ được ban hành trong thư mục của lib vừa tải xuống.

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

YÊU CẦU

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
Điều này phức tạp không cần thiết, các bước trong câu trả lời của tôi cũng xây dựng GCC được liên kết tĩnh, không có quyền truy cập root và bạn không cần phải thiết lập LD_LIBRARY_PATHđể sử dụng GCC kết quả.
Jonathan Wakely

Điều này cũng hoạt động trong các tình huống có xung đột với bất cứ điều gì được cài đặt trong các đường dẫn "được xác định rõ" (nghĩa là các trường hợp quy trình chuẩn hoàn toàn không hoạt động). Các phiên bản mới nhất kể từ 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

Đã sử dụng những gì Jonathan ở trên đã đề cập ngoại trừ việc tôi phải tải xuống gmp và mpfr bằng tay và tạo liên kết mềm (phân phối gcc 4.4.2 có thể không có "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, sử dụng "-with-gmp" và "with-mpfr" với "./cool" đã cho tôi "configure: error: không thể tính hậu tố của các tệp đối tượng: không thể biên dịch". Do đó tôi đã tải xuống srcs của gmp và mpfr và sau đó tạo liên kết mềm đến nó từ bên trong gcc src top leve dir


2

Sau khi cố gắng cài đặt các phụ thuộc GCC bao gồm GMP, MPFRMPC. Tôi chạy vào các yêu cầu cài đặt bổ sung, lỗi và các tập tin bị thiếu; chẳng hạn như tệp tiêu đề gmp.h được MPFR yêu cầu để cài đặt. Có một số vấn đề bạn sẽ gặp phải trong quá trình này. Tuy nhiên, có một cách dễ dàng hơn để xây dựng và cài đặt GCC-X.0.0 hoặc sau phiên bản với một liên kết tự động .

TÙY CHỌN MỘT.

Để tránh những rắc rối của Xây dựng với make, hãy cài đặt và Liên kết các thư viện động, chỉ cần:

  • Tải xuống phiên bản GCC-X.0.0 của bạn (với phiên bản mới nhất từ: https://gcc.gnu.org/ )

  • Trích xuất các tệp gcc-X-000.tar.gz vào một vị trí / somepath /.

  • Khi bạn đã giải nén tệp .tar.gz, hãy chạy tập lệnh ./contrib/doad_prerequisites nằm trên / somepath / hoặc thư mục nguồn.

  • Kịch bản này sẽ tải về các thư viện hỗ trợ bao gồm: GMP, MPFRMPC và sẽ tạo ra một liên kết tượng trưng cho bạn, mà sẽ BUILD tất cả phụ thuộc gcc tự động như là một phần của quá trình gcc cài đặt.

    Không cần xây dựng và liên kết các thư viện hỗ trợ đã được tải xuống / somepath / bằng cách phát hành Make, Make Install hoặc chạy tệp ./mình hoặc thêm các liên kết như --with-gmp = / gmp_path / ... / ..... , --with-mpfr = / mpfr_path / ... / ... bởi vì điều này đã được thực hiện khi bạn chạy tập lệnh tạo liên kết tượng trưng .

TÙY CHỌN HAI.

  • Sử dụng hệ thống quản lý Gói hệ điều hành của bạn để cài đặt các thư viện hỗ trợ ở vị trí hệ thống tiêu chuẩn. Đối với hệ thống dựa trên Debian bao gồm Ubuntu, Cài đặt các gói libgmp-dev, libmpfr-devlibmpc-dev . Đối với hệ thống dựa trên RPM bao gồm Fedora và SUSE, hãy cài đặt các gói gmp-devellibmpc-devel ( mpc-devel trên SUSE).
  • Tùy chọn này sẽ cài đặt các thư viện và tệp tiêu đề trong một thư mục hệ thống tiêu chuẩn nơi chúng sẽ được tìm thấy tự động khi xây dựng GCC.
  • Đây là lợi thế của Quản lý cài đặt gói hệ điều hành khi bạn gọi cài đặt "sudo apt-get install libgmp-dev" hoặc "sudo apt-get install libmpfr-dev" và liên kết được thực hiện cho bạn. Ngoài ra, bạn không phải xây dựng các thư viện hỗ trợ với Make, Make install hoặc ./cool. Thêm vào đó, quá trình này mất vài phút để hoàn thành tất cả quy trình.
  • Bây giờ bạn có thể tiến hành cài đặt GCC.

CẤU HÌNH:

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

Vấn đề:

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

Lưu ý:

--enable-ngôn ngữ như c ++ hoặc c.

--disable-multilib ; vô hiệu hóa multilib dựa trên hệ thống và hệ điều hành của bạn, bạn sẽ được nhắc về multilib để tiếp tục.

Thực hiện sẽ mất nhiều thời gian để hoàn thành. Tuy nhiên, bạn có thể đưa ra tùy chọn -j #no_pro. Điều này sẽ chạy Make song song dựa trên số lượng bộ xử lý trên PC hoặc Mac của bạn.

Để biết thông tin chi tiết về cách thực hiện quy trình này, bạn có thể truy cập: https://gcc.gnu.org/wiki/InstallingGCC .


1

Tôi đã làm theo câu trả lời được chấp nhận hàng đầu bởi joelparkerhenderson. Đây là câu trả lời tốt nhất mà tôi có thể tìm thấy để cài đặt trên hệ thống * NIX qua internet.

Đối với hậu thế tôi muốn thêm rằng nếu bạn gặp lỗi như "lỗi cài đặt: không thể tính hậu tố của tệp đối tượng: không thể biên dịch"

sau đó cập nhật LD_LIBRBARY_PATH của bạn với / tmp / gcc / lib (Xem câu trả lời đầy đủ của joelparkerhenderson cho ngữ cảnh)

/ tmp / gcc / lib chứa tất cả mpfr / mpc / gmp cần thiết để các tệp và trình liên kết thời gian chạy không thể tìm thấy chúng trừ khi bạn thêm chúng vào LD_LIBRARY_PATH. Cũng đừng quên xuất LD_LIBRARY_PATH;). Thêm ngữ cảnh tại đây: https://gcc.gnu.org/wiki/FAQ#configure_suffix


Phải cập nhật LD_LIBRARY_PATH của bạn chỉ để sử dụng trình biên dịch là ngu ngốc. Nếu bạn sử dụng stackoverflow.com/a/10662297/981959 thay vào đó không cần thiết.
Jonathan Wakely
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.