Lỗi biên dịch: “g ++: lỗi khi cố gắng thực thi 'cc1plus': executevp: Không có tệp hoặc thư mục nào như vậy”


95

Khi tôi biên dịch chương trình C / C ++ với popentrong php... Tôi gặp lỗi này:

g++: error trying to exec 'cc1plus': execvp: No such file or directory

nhưng nếu tôi chạy mã php trong shell .. thì nó hoạt động tốt ..

trong Arch Linux ..

Mã PHP:

<?php
    function rfile($fp) {
    $out="";
       while (!feof($fp)) {
           $out.= fgets($fp, 1024000);
       }
       return $out;
    }
    $p = popen('g++ -Wall -g aplusb.cc -o aplusb 2>&1', 'r');
    $result = rfile($p);
    pclose($p);
    echo $result;
?>

cảm ơn


2
Bạn đã thử in các biến env và so sánh chúng chưa? Bạn có bật hay tắt chế độ an toàn không?
Vyktor

vâng .. Tôi đã so sánh các biến env giữa php và vỏ ... nhưng nó không có bất kỳ sự giúp đỡ ... và chế độ an toàn của tôi đang Tắt ..
Zeyi Fan

Bạn đang sử dụng cùng một người dùng hay đang thực thi tập lệnh từ máy chủ web? Thêm "-v" (nên là đầu ra dài dòng), có thể sẽ có câu trả lời.
Vyktor

ok .. tôi vừa thử nghiệm để biên dịch mã C ++ và chạy php xx.phpvới tư cách httpngười dùng. tất cả trong số họ là thành công ... và đầu ra của g++ -vtrong mã php là tương tự với vỏ của nó ..
Zeyi Fan

1
gcc -print-search-dirsCòn cái này thì sao? Các đầu ra có giống nhau không?
Vyktor

Câu trả lời:


120

Bạn cần cài đặt gcc-c++gói.

yum install gcc-c++

27
đối với núi cao, đây làapk add g++
shadi

45

Tôi không biết tại sao nhưng tôi vừa đổi tên tệp nguồn COLARR.C của mình thành colarr.c và lỗi đã biến mất! có lẽ bạn cần cái này

sudo apt-get install g++

2
Lưu ý rằng phần .Cmở rộng chữ hoa là một trong số các quy ước cho nguồn C ++ - .cpp.cclà hai quy ước khác. Quy .Cước viết hoa tương tác không tốt với các hệ thống tệp không phân biệt chữ hoa chữ thường (ví dụ: Windows, macOS). Khi bạn có COLARR.C, hệ thống có thể đang xem nó như một tệp nguồn C ++; vì colarr.cnó là một tệp nguồn C.
Jonathan Leffler

23

Sự cố này có thể xảy ra nếu cài đặt các phiên bản g ++ và gcc khác nhau.

   g++ --version
   gcc --version

Nếu những điều này không cho kết quả, có thể bạn đã cài đặt nhiều phiên bản gcc. Bạn có thể kiểm tra bằng cách sử dụng:

    dpkg -l | grep gcc | awk '{print $2}'

Thông thường, / usr / bin / gcc sẽ được liên kết với sym với / etc / Alternatives / gcc, lại được liên kết với sym để nói /usr/bin/gcc-4.6 hoặc /usr/bin/gcc-4.8 (Trong trường hợp bạn có gcc-4.6, gcc-4.8 đã được cài đặt.)

Bằng cách thay đổi liên kết này, bạn có thể làm cho gcc và g ++ chạy trong cùng một phiên bản và điều này có thể giải quyết sự cố của bạn!


Điều này không giải quyết được vấn đề, tôi không tìm ra cách thay đổi các liên kết này.
Brana

Nó hoạt động và lỗi sẽ biến mất sau khi tôi sửa đổi liên kết mềm của / etc / Alternatives / gcc từ / usr / bin / gcc72 thành / usr / bin / gcc48 với ln -fs / usr / bin / gcc48 / etc / Alternatives / gcc .
buxizhizhoum

7

Mỗi trình biên dịch có thư mục libexec / của riêng nó. Thông thường thư mục libexec chứa các chương trình trợ giúp nhỏ được gọi bởi các chương trình khác. Trong trường hợp này, gcc đang tìm kiếm trình biên dịch 'cc1' của riêng nó. Máy của bạn có thể chứa các phiên bản gcc khác nhau và mỗi phiên bản phải có 'cc1' riêng. Thông thường các trình biên dịch này được đặt trên:


/usr/local/libexec/gcc/<architecture>/<compiler>/<compiler_version>/cc1

Đường dẫn tương tự cho g ++. Lỗi trên có nghĩa là phiên bản gcc hiện tại được sử dụng không thể tìm thấy trình biên dịch 'cc1' của riêng nó. Điều này thường chỉ ra một vấn đề PATH.


Tôi đã gặp vấn đề tương tự với môi trường PATH của mình khi chạy, strace g++ [args]tôi phát hiện ra rằng nó đang thử nhầm thư mục trong đường dẫn sau đó bỏ cuộc.
sirbrialliance

2

Tôi đã gặp vấn đề tương tự khi fork với 'python'; lý do chính là đường dẫn tìm kiếm là tương đối, nếu bạn không gọi g++/usr/bin/g++, nó sẽ không thể tìm ra các đường dẫn chính tắc để gọi cc1plus.


0

Tôi đã gặp vấn đề tương tự với gcc "gnat1" và đó là do đường dẫn bị sai. Gnat1 ở phiên bản 4.6 nhưng tôi đang thực thi phiên bản 4.8.1 mà tôi đã cài đặt. Như một giải pháp tạm thời, tôi đã sao chép gnat1 từ 4.6 và dán vào thư mục 4.8.1.

Đường dẫn đến gcc trên máy tính của tôi là / usr / lib / gcc / i686-linux-gnu /

Bạn có thể tìm thấy đường dẫn bằng cách sử dụng lệnh find:

find /usr -name "gnat1"

Trong trường hợp của bạn, bạn sẽ tìm kiếm cc1plus:

find /usr -name "cc1plus"

Tất nhiên, đây là một giải pháp nhanh chóng và một câu trả lời chắc chắn hơn sẽ là sửa chữa đường dẫn bị hỏng.



0

Đã xảy ra sự cố với cài đặt GCC của bạn . Hãy thử cài đặt lại nó như sau:

sudo apt-get install --reinstall g++-5

Trong Ubuntu, g++là một gói phụ thuộc cài đặt phiên bản mặc định g++cho phiên bản hệ điều hành của bạn. Vì vậy, chỉ cần gỡ bỏ và cài đặt lại gói sẽ không hoạt động, vì nó sẽ cài đặt phiên bản mặc định. Đó là lý do tại sao bạn cần phải cài đặt lại.

Lưu ý: Bạn có thể thay thế g++-5bằng g++phiên bản mong muốn của bạn . Để tìm g++phiên bản hiện tại của bạn, hãy chạy cái này:

g++ --version

0

Bạn cũng có thể gặp sự cố này nếu bạn có biến môi trường GCC_ROOT trỏ đến một vị trí sai. Có lẽ cách khắc phục đơn giản nhất có thể là (trên * nix like system):

unset GCC_ROOT

trong những trường hợp phức tạp hơn, bạn có thể phải đặt nó đến vị trí thích hợp

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.