2012-01-16 39 views
63

Khi tôi biên dịch chương trình C/C++ với popen trong php ... Tôi đã nhận lỗi này:Compile error: "g ++: lỗi khi cố gắng exec 'cc1plus': execvp: Không có tập tin hoặc thư mục"

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

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

trong Arch Linux ..

PHP Code:

<?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; 
?> 

thanks

+2

Bạn đã cố gắng để in biến env và so sánh chúng? Bạn có bật hoặc tắt chế độ an toàn không? – Vyktor

+0

vâng .. Tôi đã so sánh các biến env giữa php và shell ... nhưng nó không có bất kỳ trợ giúp nào ... và chế độ an toàn của tôi là Tắt .. –

+0

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

Trả lời

74

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

yum install gcc-c++ 
+3

cho alpine, đây là 'apk add g ++ ' – shadi

6

Mỗi trình biên dịch có thư mục libexec/riêng của 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 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 khác nhau của gcc và mỗi phiên bản phải có 'cc1' riêng của nó. Thông thường, các trình biên dịch này nằm 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 chính nó. Điều này thường chỉ đến một vấn đề PATH.

+0

Tôi đã có cùng một vấn đề với môi trường PATH của tôi khi tôi chạy 'strace g ++ [args]' Tôi phát hiện ra nó đã cố gắng thư mục sai trong đường dẫn sau đó bỏ cuộc. – sirbrialliance

0

Tôi gặp vấn đề tương tự với gcc "gnat1" và đó là do đường dẫn bị sai. Gnat1 đã có trên 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. Là 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 ra con đường 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à giải pháp nhanh và câu trả lời chắc chắn hơn sẽ sửa chữa đường dẫn bị hỏng.

27

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

sudo apt-get install g++ 
+0

Lưu ý rằng phần mở rộng' .C' chữ thường là một trong số các quy ước cho nguồn C++ - '.cpp' và' .cc' là hai phần tử khác. Phương thức '.C' phía trên tương tác xấu với các hệ thống tệp phân biệt chữ hoa chữ thường (ví dụ: Windows, macOS). Khi bạn có 'COLARR.C', hệ thống có thể xem nó như là một tệp nguồn C++; là 'colarr.c', nó là tệp nguồn C. –

12

Vấn đề này có thể xảy ra nếu các phiên bản khác nhau của g ++ và gcc được cài đặt.

g++ --version 
    gcc --version 

Nếu không đưa ra kết quả, bạn có thể đã 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 sym liên kết đến/etc/alternatives/gcc mà là một lần nữa sym liên kết để nói /usr/bin/gcc-4.6 hoặc /usr/bin/gcc-4.8 (Trong trường hợp bạn đã cài đặt gcc-4.6, gcc-4.8.)

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

3

Tôi gặp vấn đề tương tự khi tắt bằng '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 đường dẫn chuẩn để gọi cc1plus.

1

Install g ++ trên OpenSUSE chạy

zypper in gcc-c++ 
Các vấn đề liên quan