ข้อผิดพลาดในการคอมไพล์:“ g ++: เกิดข้อผิดพลาดขณะพยายาม exec 'cc1plus': execvp: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว "


100

เมื่อฉันรวบรวมโปรแกรม C / C ++ ด้วยpopenในphp... ฉันได้รับข้อผิดพลาดนี้:

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

แต่ถ้าฉันเรียกใช้โค้ด php ในเชลล์ .. ก็ใช้ได้ดี ..

ใน Arch Linux ..

รหัส 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;
?>

ขอบคุณ


2
คุณลองพิมพ์ตัวแปร env แล้วเปรียบเทียบหรือยัง คุณเปิดหรือปิดโหมดปลอดภัยหรือไม่
Vyktor

ใช่ .. ฉันเปรียบเทียบตัวแปร env ระหว่าง php และเชลล์ ... แต่ไม่มีความช่วยเหลือใด ๆ ... และโหมดปลอดภัยของฉันปิดอยู่ ..
Zeyi Fan

คุณใช้ผู้ใช้คนเดียวกันหรือเรียกใช้สคริปต์จากเว็บเซิร์ฟเวอร์หรือไม่? เพิ่ม "-v" (ควรเป็นเอาต์พุตแบบละเอียด) อาจจะมีคำตอบ
Vyktor

ตกลง .. ฉันเพิ่งทดสอบเพื่อรวบรวมรหัส C ++ และเรียกใช้php xx.phpในฐานะhttpผู้ใช้ ทั้งหมดนี้คือความสำเร็จ ... และผลลัพธ์ของg++ -vโค้ด php ก็คล้ายกับในเชลล์ ..
Zeyi Fan

1
gcc -print-search-dirsแล้วเป็นอย่างไรบ้าง? เอาต์พุตเหมือนกันหรือไม่?
Vyktor

คำตอบ:



52

ฉันไม่รู้ว่าทำไม แต่ฉันเพิ่งเปลี่ยนชื่อไฟล์ต้นฉบับของฉัน COLARR.C เป็น colarr.c และข้อผิดพลาดก็หายไป! คุณอาจต้องการสิ่งนี้

sudo apt-get install g++

2
โปรดทราบว่า.Cส่วนขยายตัวพิมพ์ใหญ่เป็นหนึ่งในข้อตกลงหลายประการสำหรับซอร์ส C ++ .cppและ.ccเป็นอีกสองข้อ รูปแบบตัวพิมพ์ใหญ่.Cโต้ตอบไม่ดีกับระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ (เช่น Windows, macOS) เมื่อคุณมีCOLARR.Cระบบอาจมองว่ามันเป็นซอร์สไฟล์ C ++ เนื่องจากcolarr.cเป็นไฟล์ต้นฉบับ C
Jonathan Leffler

23

ปัญหานี้อาจเกิดขึ้นได้หากติดตั้ง g ++ และ gcc เวอร์ชันต่างๆ

   g++ --version
   gcc --version

หากสิ่งเหล่านี้ไม่ให้ผลลัพธ์แสดงว่าคุณอาจติดตั้ง gcc หลายเวอร์ชัน คุณสามารถตรวจสอบได้โดยใช้:

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

โดยปกติ / usr / bin / gcc จะเชื่อมโยง sym กับ / etc / ทางเลือก / gcc ซึ่งเชื่อมโยง sym อีกครั้งเพื่อพูด /usr/bin/gcc-4.6 หรือ /usr/bin/gcc-4.8 (ในกรณีที่คุณมี ติดตั้ง gcc-4.6, gcc-4.8)

การเปลี่ยนลิงก์นี้จะทำให้ gcc และ g ++ ทำงานในเวอร์ชันเดียวกันและอาจช่วยแก้ปัญหาของคุณได้!


สิ่งนี้ไม่สามารถแก้ปัญหาได้ฉันไม่พบวิธีเปลี่ยนลิงก์เหล่านี้
Brana

มันใช้งานได้และข้อผิดพลาดจะหายไปหลังจากที่ฉันแก้ไข softlink ของ / etc / ทางเลือก / gcc จาก / usr / bin / gcc72 เป็น / usr / bin / gcc48 ด้วย ln -fs / usr / bin / gcc48 / etc / ทางเลือก / gcc .
buxizhizhoum

8

แต่ละคอมไพเลอร์มี libexec / directory ของตัวเอง โดยปกติไดเร็กทอรี libexec จะมีโปรแกรมตัวช่วยขนาดเล็กที่เรียกโดยโปรแกรมอื่น ในกรณีนี้ gcc กำลังมองหาคอมไพเลอร์ 'cc1' ของตัวเอง เครื่องของคุณอาจมี gcc เวอร์ชันต่างๆและแต่ละเวอร์ชันควรมี 'cc1' เป็นของตัวเอง โดยปกติคอมไพเลอร์เหล่านี้จะอยู่ที่:


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

เส้นทางที่คล้ายกันสำหรับ g ++ ข้อผิดพลาดข้างต้นหมายความว่าเวอร์ชัน gcc ปัจจุบันที่ใช้ไม่สามารถค้นหาคอมไพเลอร์ 'cc1' ของตัวเองได้ โดยปกติจะชี้ไปที่ปัญหาเส้นทาง


ฉันมีปัญหาเดียวกันกับสภาพแวดล้อม PATH ของฉันเมื่อฉันวิ่งstrace g++ [args]ฉันพบว่ามันพยายามโฟลเดอร์ผิดในเส้นทางจากนั้นก็ล้มเลิก
sirbrialliance

2

ฉันมีปัญหาเดียวกันเมื่อใช้ 'python'; สาเหตุหลักคือเส้นทางการค้นหาเป็นแบบสัมพัทธ์หากคุณไม่เรียกg++เป็น/usr/bin/g++ก็จะไม่สามารถคำนวณเส้นทางตามรูปแบบที่จะเรียกcc1plusได้


0

ฉันมีปัญหาเดียวกันกับ gcc "gnat1" และเป็นเพราะเส้นทางไม่ถูกต้อง Gnat1 เป็นเวอร์ชัน 4.6 แต่ฉันกำลังเรียกใช้เวอร์ชัน 4.8.1 ซึ่งฉันได้ติดตั้งไว้ เป็นวิธีแก้ปัญหาชั่วคราวฉันคัดลอก gnat1 จาก 4.6 และวางไว้ในโฟลเดอร์ 4.8.1

เส้นทางไปยัง gcc บนคอมพิวเตอร์ของฉันคือ / usr / lib / gcc / i686-linux-gnu /

คุณสามารถค้นหาเส้นทางได้โดยใช้คำสั่ง find:

find /usr -name "gnat1"

ในกรณีของคุณคุณจะมองหา cc1plus:

find /usr -name "cc1plus"

แน่นอนว่านี่เป็นวิธีแก้ปัญหาที่รวดเร็วและคำตอบที่มั่นคงกว่าคือการแก้ไขเส้นทางที่เสีย



0

เกิดข้อผิดพลาดกับการติดตั้งGCCของคุณ ลองติดตั้งใหม่เช่นนี้:

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

ใน Ubuntu g++เป็นแพ็คเกจอ้างอิงที่ติดตั้งเวอร์ชันเริ่มต้นg++สำหรับเวอร์ชันระบบปฏิบัติการของคุณ ดังนั้นเพียงแค่ลบและติดตั้งแพ็คเกจอีกครั้งก็ไม่ได้ผลเพราะจะติดตั้งเวอร์ชันเริ่มต้น นั่นเป็นเหตุผลที่คุณต้องติดตั้งใหม่

หมายเหตุ: คุณสามารถแทนที่g++-5ด้วยg++เวอร์ชันที่คุณต้องการได้ หากต้องการค้นหาg++เวอร์ชันปัจจุบันของคุณให้รันสิ่งนี้:

g++ --version

0

คุณอาจมีปัญหานี้เช่นกันหากคุณมีตัวแปรสภาพแวดล้อม GCC_ROOT ชี้ไปยังตำแหน่งที่ไม่ถูกต้อง การแก้ไขที่ง่ายที่สุดอาจเป็น (บน * nix เช่นระบบ):

unset GCC_ROOT

ในกรณีที่ซับซ้อนมากขึ้นคุณอาจต้องทำการเจิมใหม่ในตำแหน่งที่เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.