Cách đặt gcc 4.8 làm trình biên dịch gcc mặc định


27

Gần đây tôi đã cài đặt gcc 4.8sử dụng brewtrên OSX 10.7.5 (Lion). Bây giờ tôi có thể biên dịch bằng gcc 4.8cách sử dụng

g++-4.8 some_file.c

hoặc sử dụng mặc định gcc 4.2bằng cách sử dụng

g++ some_file.c

Tôi muốn sử dụng gcc 4.8làm trình biên dịch mặc định cho Xcodevà nếu tôi gõ gccở thiết bị đầu cuối. Tôi cho rằng tôi phải thay đổi gcc-relatedliên kết trong dirname $(which gcc).

Khi tôi làm

ls -al $(dirname $(which gcc)) | grep 'gcc\|g++\|c++'

Tôi nhận được như sau:

lrwxr-xr-x     1 root   wheel         7 Jul 31 12:17 c++ -> clang++
-rwxr-xr-x     1 root   wheel    909360 Nov 18  2011 c++filt
lrwxr-xr-x     1 root   wheel         5 Jul 31 12:17 clang++ -> clang
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 g++ -> llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 gcc -> llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        28 Jul 31 12:17 gcov-4.2 -> ../llvm-gcc-4.2/bin/gcov-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2

Khi tôi chạy: which gcc-4.8tôi nhận được /usr/local/bin/gcc-4.8.

Các bước để thực hiện điều này sẽ rất hữu ích.

Xin vui lòng và cảm ơn bạn.


1
Bất kỳ lý do không sử dụng llvm clang cấp trên?
Tối đa

Không cụ thể. Lợi ích của llvm clang so với vanilla gcc là gì?
quine

3
Mặc dù nhanh hơn nhưng nó cũng cung cấp các cảnh báo có ý nghĩa, một tính năng thực sự quý giá gcc hoàn toàn thiếu.
Max Ried

Tôi hiểu rồi. Là clang 3.3tương đương với gcc 4.8? Tôi tin rằng tôi có thể làm brew installđiều đó là tốt.
quine

Câu hỏi đầu tiên cần hỏi là tại sao bạn không thể sử dụng tiếng kêu được cung cấp với Xcode chứ không phải gcc-4.8 - sau đó chúng tôi có thể trả lời clang3.3 sẽ hoạt động
user151019

Câu trả lời:


20

Giả sử bạn đang sử dụng bash (đó là mặc định), thì bạn có thể thêm / usr / local / bin làm ưu tiên hàng đầu của bạn trong PATH như thế này:

echo "PATH=\"/usr/local/bin:$PATH\"" >> ~/.bash_profile

Điều này sẽ đảm bảo rằng / usr / local / bin được kiểm tra trước tất cả các khu vực khác trên đường dẫn của bạn. Sau đó, chỉ cần bắt đầu một phiên cuối mới để tải biến mới.

Một cách khác để làm điều này:

  cd /usr/bin
  rm cc gcc c++ g++
  ln -s /usr/local/bin/gcc-4.8 cc
  ln -s /usr/local/bin/gcc-4.8 gcc
  ln -s /usr/local/bin/c++-4.8 c++
  ln -s /usr/local/bin/g++-4.8 g++

Con đường suy nghĩ của tôi đã chứa usr/local/bin. echo $PATHtiết lộ: / opt / local / bin: / opt / local / sbin: / opt / local / bao gồm: / usr / local / mysql / bin: / usr / bin / bjam: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin: / usr / local / go / bin: / usr / texbin
quine

Đã thêm tùy chọn khác
Digitalchild

1
Có nó chứa nó nhưng nó là sau / usr / bin nên nó không được đọc trước. PATH là tuần tự.
Digitalchild

1
Cả hai lựa chọn dường như không làm việc cho tôi. Tôi đã chuyển /usr/local/binsang xuất hiện đầu tiên PATH- không có tác dụng - cuộc gọi gccvẫn nhìn. gcc 4.2Tôi sau đó tự tạo các liên kết tượng trưng, ​​nhưng khi tôi mở một cửa sổ đầu cuối mới và g++hoặc ( cc|c++|gcc) tất cả đều không tìm thấy. Lạ thật. Cảm ơn sự giúp đỡ của bạn
quine

3
Tôi không khuyên bạn nên chơi trong /usr/binbất kỳ Unix nào (mà MacOS X là) trừ khi bạn là chuyên gia làm việc về các nguồn của phiên bản mới của phiên bản Unix tiếp theo.
dan

19

Cảm ơn tất cả các bạn vì đã giúp đỡ. Tôi đã kết thúc việc tạo bí danh trong ~/.bash_profilenhư sau:

alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g++='g++-4.8'
alias c++='c++-4.8'

Câu trả lời từ Lynken rất hữu ích, nhưng tôi đã điều chỉnh nó bằng các bí danh vì điều đó giúp tôi dễ dàng hoàn tác hơn nếu cần thiết.

Cụ thể, nếu PATHđược đặt sao cho /usr/local/bin(nơi brew đặt liên kết đến gcc 4.8) xuất hiện trước khi xuất hiện /usr/bin(nơi gccđược liên kết theo mặc định), thì việc tạo liên kết như Lyken được đề xuất trong /usr/local/binlý thuyết sẽ phù hợp với tôi. Trong thực tế, không vì một lý do nào đó - thất bại với lỗi liên kết và bí danh cũng khắc phục lỗi đó mà tôi không cần phải giải quyết vấn đề đó.

Lợi ích khác của bí danh là tôi không phải liên kết mà tôi muốn homebrew xử lý và không phải cạnh tranh với công cụ mà phiên bản gcc được liên kết trong /usr/local


Bạn có thể phải thay đổi điều này cho bất kỳ nhị phân mới nào bạn sẽ cài đặt bên trong /usr/local/bin. Bạn cũng có thể có các tệp nhị phân khác được cài đặt và ẩn vì vị trí xấu /usr/local/bintrong PATH của bạn. Hãy xem xét một lần nữa câu trả lời của tôi, nó đang tấn công vấn đề thực sự của bạn một lần, chính xác và mãi mãi.
dan

Đúng. Tôi đã đề cập trước đó với Lyken rằng tôi đã thay đổi PATHvà đặt /usr/local/bintrước tất cả. Tôi thừa nhận rằng tuyên bố của bạn là chính xác & tôi cần phải thay đổi PATH, nhưng (trong trường hợp của tôi - tức là brewcài đặt mặc định gcc 4.8) Tôi vẫn không gọi gcc 4.8theo mặc định khi tôi gọi gccvì không có liên kết giữa hai bên theo mặc định. Tôi phải tự tạo nó như tôi đã làm ở trên.
quine

Tôi muốn nói rằng nó đủ khác nhau để trở thành câu trả lời của riêng mình, tôi sẽ đánh dấu câu trả lời của bạn là đã được giải quyết.
Digitalchild

Ok - cảm ơn Lyken. Tôi sẽ ngay khi hệ thống cho phép tôi làm như vậy.
quine

1
Tôi cũng đã thử bí danh nhưng nó chỉ hoạt động đúng nếu bạn chạy gcctrực tiếp từ thiết bị đầu cuối. Nếu bạn sử dụng makefile, clangvẫn được sử dụng, tôi chỉ thấy vấn đề này khi sử dụng tùy chọn trình biên dịch chỉ khả dụng gcc.
Tiến Đỗ

11

Tôi sử dụng để gcc-4.8:

export CC=/usr/local/bin/gcc

export CXX=/usr/local/bin/g++

export CPP=/usr/local/bin/cpp

export LD=/usr/local/bin/gcc

alias c++=/usr/local/bin/c++

alias g++=/usr/local/bin/g++

alias gcc=/usr/local/bin/gcc

alias cpp=/usr/local/bin/cpp

alias ld=/usr/local/bin/gcc

alias cc=/usr/local/bin/gcc

và trở lại với gcc táo:

export CC=/usr/bin/gcc

export CXX=/usr/bin/g++

export CPP=/usr/bin/cpp

export LD=/usr/bin/ld

alias c++=/usr/bin/c++

alias g++=/usr/bin/g++

alias gcc=/usr/bin/gcc

alias cpp=/usr/bin/cpp

alias cc=/usr/bin/gcc

alias ld=/usr/bin/ld

hoặc đặt nó trong tập tin và sau đó: source <file>


1

Giả sử việc khởi tạo shell thực tế của bạn được thực hiện thông qua ~/.profile, sau đó bạn sẽ phải sửa đổi nó để đi /usr/local/bintrước bất kỳ thành phần PATH nào khác gccvà tất cả các nhị phân liên quan của nó.

Đây là cách để thực hiện sửa đổi sạch này:

CD

_shell_init = `egrep '(^ |) PATH' .profile 2> / dev / null`

if ["$ {_ shell_init}" = ""]; sau đó
    # PATH không được xác định trong .profile
    # cài đặt định nghĩa tương đối đầu tiên của PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
xuất PATH '>>. hồ sơ
    . .Hồ sơ
    thực hiện $ {SHELL}
khác
    # xóa tất cả các lần xuất hiện của / usr / local / bin bất cứ nơi nào chúng có thể
    # được đặt vào PATH và chèn nó trước tất cả các thành phần khác
    sed -E -e '/ (^ |) PATH = / s ,: / usr / local / bin ,,' \
        -e '/ (^ |) PATH = / s, / usr / local / bin: ,,' \
        -e '/ (^ |) PATH = / s ,, & / usr / local / bin:,' .profile> .profile.new
    mv .profile.new .profile
    . .Hồ sơ
    thực hiện $ {SHELL}
fi

Chú ý: nếu ~/.profilecấu trúc của bạn đã được cấu trúc, tập lệnh shell này sẽ phải được điều chỉnh thủ công để phù hợp với định nghĩa PATH chính xác ở đúng nơi.


Điều này chắc chắn là hoàn hảo để sửa đổi PATHđể /usr/local/binđược nhìn thấy đầu tiên. Điều này có thể sẽ cứu tôi đau đầu trong tương lai. Tôi ước tôi có thể +1 bạn. Vấn đề của tôi mặc dù là gccvẫn còn liên quan đến gcc 4.2và không gcc 4.8vì không có liên kết tượng trưng cho gcc -> gcc-4.8trong /usr/local/bin. Tôi vẫn sẽ cần phải đặt bí danh gccnhư gcc-4.8bên trong ~/.profilehoặc symlink ( ln -s gcc-4.8 gcc) /usr/local/binsau khi cập nhật PATHvới tập lệnh của bạn. Các bạn?
quine

Tôi ngạc nhiên brewđã không thêm các liên kết tượng trưng đúng. Bạn đã đọc câu trả lời này về cùng một chủ đề: apple.stackexchange.com/a/38247/22003 ?
dan

0

Giả định việc tạo bí danh hoặc liên kết đến các nhị phân gcc khác nhau sẽ khiến chúng sử dụng bao gồm riêng trước khi hệ thống bao gồm thư mục mặc định.

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.