ข้อผิดพลาด“ การรวมที่ไม่ได้แก้ไข” กับ Eclipse CDT สำหรับส่วนหัวไลบรารีมาตรฐาน C


97

ฉันตั้งค่า CDT สำหรับ eclipse และเขียนโปรแกรม hello world C ง่ายๆ:

#include <stdio.h>

int main(void){
    puts("Hello, world.");
    return 0;
}

โปรแกรมสร้างและทำงานอย่างถูกต้อง แต่ eclipse ยังคงแสดงเครื่องหมายคำถามสีเหลืองนี้ที่ด้านข้างของคำสั่งการรวมที่ระบุว่า"Unresolved inclusion: <stdio.h>"เมื่อฉันวางเมาส์เหนือมัน

ไม่มีผลกับการทำงานของโปรแกรม แต่ฉันคิดว่ามันค่อนข้างน่ารำคาญ

ใครมีความคิดที่จะลบออกหรือไม่


2
คุณคิดว่าตัวอย่าง Hello World จะช่วยคุณได้หรืออย่างน้อยก็ให้ความช่วยเหลือ ถ้า eclipse ไม่มีคอมไพเลอร์ทำไมถึงไม่มี
Doug Molineux

คำตอบ:


52

คอมไพเลอร์ Eclipse กำลังใช้อยู่สามารถแก้ไขสัญลักษณ์ได้ดีดังนั้นโค้ดจะคอมไพล์ได้ดี

แต่การเติมโค้ด / ตัวทำดัชนีหรือ Eclipse ตัวประมวลผลก่อนใช้ไม่ทราบว่าstdio.hมีอยู่ที่ไหน

คุณต้องระบุพา ธ ของระบบไฟล์ที่stdio.hอยู่

เอกสาร Eclipse อธิบายสิ่งนี้ในหลายส่วนสำหรับคอมไพลเลอร์:

และหากการเติมโค้ด / ตัวทำดัชนีหรือตัวประมวลผลล่วงหน้าโดยเฉพาะไม่พบstdio.h:

ตำแหน่งที่แน่นอนของstdio.hจะขึ้นอยู่กับระบบที่คุณต้องการเขียนโค้ด หากคุณกำลังเขียนโค้ดสำหรับระบบเดียวกับที่คุณใช้งาน Eclipse อยู่ตำแหน่งมาตรฐาน/usr/include/stdio.hสำหรับ Linux, macOS, Cygwin และอื่น ๆ

หากคุณกำลังรวบรวมข้ามระบบสำหรับระบบเป้าหมายแยก / ระยะไกล (เช่น Android, Raspberry Pi, STM32) ระบบจะอยู่ที่ใดที่หนึ่งใน SDK ที่คุณติดตั้งสำหรับระบบนั้น คุณจะต้องอ้างถึงเอกสาร SDK นั้น ๆ


2
ขอบคุณสำหรับการตอบกลับ. แต่เส้นทางสำหรับ Ubuntu 11.10 อยู่ที่ไหน?
Derrick Zhang

สิ่งหนึ่งที่ทำให้ฉันสับสนคือฉันต้องเพิ่มเส้นทางไปยังแท็บ "รวม" แทนที่จะเป็นแท็บ "เส้นทางห้องสมุด" ฉันมักจะคิดว่า "cornerbracket" รวมถึง "ไลบรารี" ด้วย
aaaidan

1
คุณระบุตำแหน่งที่จะค้นหาไฟล์ส่วนหัว (เช่นไฟล์. h) บนแท็บรวม คุณบอกผู้เชื่อมโยงว่าจะค้นหาไฟล์ไลบรารีที่คอมไพล์ได้ที่แท็บเส้นทางไลบรารี รูปแบบของอัญประกาศเทียบกับวงเล็บเหลี่ยมอาจขึ้นอยู่กับคอมไพเลอร์ แต่ฉันมักจะนึกถึงความหมาย <> เป็นอันดับแรกในไลบรารีระบบมาตรฐานและ "" เป็นความหมายที่มองในโปรเจ็กต์ของฉันก่อน
ทอด

2
คอมไพเลอร์สมัยใหม่ทำให้ไม่มีความแตกต่างระหว่างเครื่องหมายคำพูดและวงเล็บมุม ส่วนหัวของระบบมาตรฐานทั่วไปยังคงอยู่ในวงเล็บเหลี่ยม
Seppo Enarvi

54

ฉันพบว่าคำตอบเหล่านี้ (รวมถึงคำตอบที่ยอมรับ) ค่อนข้างคลุมเครือ

สำหรับฉันฉันต้องเพิ่มเส้นทางที่ stdio.h ตั้งอยู่ (ตามที่ @ardnew กล่าว) ใน Eclipse คุณเปิดคุณสมบัติของโปรเจ็กต์ขยาย "C / C ++ General" และเลือก "Paths and Symbols"

ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มincludedir สำหรับแต่ละภาษาที่คุณใช้ (ในกรณีของฉันฉันต้องเพิ่มลงใน GNU C ++)

ป้อนคำอธิบายภาพที่นี่


ใกล้เคียงกับสิ่งที่ฉันต้องการมาก! เพียงแค่ต้องเปลี่ยนชื่อผู้ใช้ในเส้นทาง
Lucas

2
บน OS X คุณอาจต้องติดตั้งเครื่องมือสำหรับนักพัฒนาบรรทัดคำสั่งด้วยตนเอง (ซึ่งก่อนอื่นต้องติดตั้ง Xcode) โดยใช้คำสั่ง/usr/bin/xcode-select --installจากนั้นคุณจะสามารถชี้ Eclipse ได้ที่/usr/include/
RobV

1
บน Yosemite. ใช้ Eclipse Juno ประเภทนี้ใช้ได้ผลสำหรับฉันยกเว้นเส้นทางที่ฉันให้นั้นแตกต่างกันเล็กน้อย (/ Users / SrinivasanNatarajan / android-ndk / platforms / android-19 / arch-arm / usr / include) แม้ว่าข้อผิดพลาดที่ไม่ได้รับการแก้ไขทั้งหมดจะหายไป แต่ฉันก็ยังมีข้อสงสัยว่า "คราสห่วยจริงๆ". ต้องใช้เวลาหลายชั่วโมงเพื่อตั้งค่า IDE สำหรับการพัฒนา
Srinivasan N

1
ขอบคุณ. มีเพียงตัวแปรของคุณเท่านั้นที่ช่วยฉันได้
Nikmoon

ในกรณีของฉัน (กับ MinGW) ใช้ "ระบบไฟล์ ... " เพื่อเพิ่มไดเรกทอรี "C: \ MinGW \ include"
Gary99

17

แค่เพิ่มฐานความรู้ฉันเพิ่งทำสิ่งนี้บน win7 ด้วย cygwin

นี่คือสิ่งที่ดูเหมือนจะใช้ได้ผลสำหรับฉัน

รวมเส้นทางสำหรับ c:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\usr\include

รวมเส้นทางสำหรับ c ++:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include\c++
D:\dev\cygwin\usr\include

สิ่งนี้ทำให้ฉันได้รวบรวมสวัสดีชาวโลก


ฉันมาจากอนาคต ฉันได้มาเพื่อกล่าวขอบคุณ นี่เป็นสิ่งแรกที่ได้ผลสำหรับฉัน ฉันไม่เคยมีสวัสดีชาวโลกที่ยากขนาดนี้มาก่อน ขอบคุณครับ.
nVentimiglia

17

ไปที่ Project> Properties> C / C ++ General> Preprocessor Includes> Providers แล้วเลือกทั้งสองอย่าง:

  • "การตั้งค่าคอมไพเลอร์ในตัว CDT GCC"
  • "การตั้งค่าคอมไพเลอร์ในตัว CDT CROSS GCC"

สำหรับแต่ละรายการให้เลือกรายการย่อย: "ใช้ผู้ให้บริการส่วนกลางที่แชร์ระหว่างโปรเจ็กต์"

ทดสอบกับ Eclipse 4.8.0 ใน Ubuntu 16.04 ด้วย C และ C ++ สวัสดีชาวโลก


3
... และทำเครื่องหมายที่ช่อง "ใช้ผู้ให้บริการส่วนกลางที่แชร์ระหว่างโครงการ"
Urhixidur

ฉันต้องตรวจสอบ "ใช้ผู้ให้บริการส่วนกลางที่ใช้ร่วมกันระหว่างโครงการ" ตามที่ @Urhixidur กล่าวถึง ฉันลองวิธีแก้ปัญหาจำนวนมากสำหรับข้อผิดพลาดคราสที่สร้างขึ้นและนี่คือวิธีที่ใช้ได้จริงสำหรับฉัน เส้นเหล่านั้นน่ารำคาญ ขอบคุณ!
CodeGuyRoss

10
  • เลือกไฟล์ >> โครงการใหม่
  • ในตัวช่วยสร้างโครงการเลือกโครงการC / C ++ >> C ++
  • ในส่วน "Project type" เลือก " Makefile Project >> Hello world C ++ Project "
  • ในส่วน "Toolchains" เลือก " Linux GCC "

มันสามารถแก้ปัญหาได้ (ขอโทษที่ภาษาอังกฤษไม่ดี)


1
ฉันทำสิ่งเหล่านั้นแล้ว แต่ก็ยังไม่รู้จักว่าส่วนหัวอยู่ใน / usr / include
มนุษย์อวกาศคาร์ดิฟฟ์

ง่ายกว่าการเพิ่มตัวเองทุกครั้ง ฉันใช้ตัวเลือก cross plattform ซึ่งก็ใช้ได้ดีเช่นกัน (บน Ubuntu)
panmari

มีประโยชน์มาก! ภาษาอังกฤษดีมาก
AturSams

คุณทำสิ่งนี้กับโครงการที่มีอยู่ได้อย่างไร
Jay Elston

4

ฉันใช้ Eclipse กับ Cygwin และสิ่งนี้ใช้ได้ผลสำหรับฉัน:

ไปที่ Project> Properties> C / C ++ General> Preprocessor Includes ... > Providers แล้วเลือก "CDT GCC Built-in Compiler Settings Cygwin [Shared]"


4

ฉันกำลังทำงานกับการกำหนดค่าคอมไพเลอร์ข้ามหลายรายการโดยที่ฉันต้องใช้ตำแหน่งที่แตกต่างกันสำหรับไฟล์ส่วนหัว STD (และตัวแปรสภาพแวดล้อมอื่น ๆ )

วิธีแก้ปัญหาคือการตั้งค่าตัวทำดัชนีเพื่อใช้การกำหนดค่าที่ใช้งานอยู่
น่าเสียดายเนื่องจากข้อผิดพลาดบางอย่างใน eclipseตัวเลือกไม่ได้ถูกจัดเก็บไว้ในเครื่องดังนั้นคุณต้องใช้การกำหนดค่าพื้นที่ทำงานหากคุณต้องการบันทึกการกำหนดค่าเมื่อคุณเปิด eclipse อีกครั้ง

หน้าต่าง -> การตั้งค่า -> C / C ++ -> ดัชนี -> ใช้การกำหนดค่าการสร้างที่ใช้งานอยู่

สิ่งนี้จะทำให้ eclipse ใช้คอมไพเลอร์ที่ถูกต้องซึ่งตั้งค่าด้วยคอนฟิกูเรชัน Cross GCC ที่แอ็คทีฟของโปรเจ็กต์


มีปัญหาเดียวกันการคอมไพล์ข้ามไปที่ ESP8266 เสียดายที่เพจนี้มีคนเยอะมากเลยต้องหาข้อมูลเอง
Michael Böckling

ขอบคุณสำหรับสิ่งนี้. ฉันมีปัญหานี้เช่นกันหลังจากที่ฉันสร้างการกำหนดค่าคอมไพเลอร์ข้ามหลายรายการ (สำหรับ SDK ฝังตัว ESP32 "ESP-IDF" เวอร์ชันต่างๆ) Indexer ไม่ได้เลือกส่วนหัวที่ถูกต้อง การตั้งค่านี้ดูเหมือนจะอนุญาตให้ Indexer ใช้สภาพแวดล้อมเดียวกันกับการกำหนดค่าที่ใช้งานอยู่ซึ่งในกรณีของฉันอนุญาตให้รับส่วนหัวที่ถูกต้อง
davidA

3

ตามที่ทราบคำตอบอันดับต้น ๆ จำเป็นต้องระบุตำแหน่งของโฟลเดอร์สร้างซึ่งสามารถเพิ่มผ่านกล่องโต้ตอบที่เข้าถึงได้โดยคลิกขวาที่โปรเจ็กต์และเลือก Properties-> C / C ++ General-> Paths and Symbols

คำถามที่เหลือคือต้องเพิ่มเส้นทางอะไร

หากคุณตั้งค่า gcc อย่างถูกต้องสำหรับการเข้าถึงบรรทัดคำสั่งและต้องการทราบว่าค่าเริ่มต้นรวมพา ธ ที่ใช้คืออะไรเพียงแค่ถาม ขึ้นอยู่กับภาษาที่คุณสนใจให้ใช้:

gcc -x c -v -E /dev/null
gcc -x c++ -v -E /dev/null

... นี่จะแสดงรายการการตั้งค่าคอมไพลเลอร์เริ่มต้นที่ใช้เมื่อเรียกใช้ gcc (และคำสั่งนี้ยังใช้ได้ถ้า "gcc" เป็นนามแฝงสำหรับเสียงดังเช่นบน OSX)

/dev/null ใช้เป็นไฟล์เปล่า - เรากำลังบอกให้ gcc แยกวิเคราะห์ไฟล์ว่าง

-x <language> ระบุภาษาที่จะคอมไพล์เนื่องจากจำเป็นเพราะเราไม่ได้ใช้ไฟล์ที่มีนามสกุลที่ระบุภาษา

-v เอาต์พุต verbose ซึ่งรวมถึงเอาต์พุตรวมพา ธ

-E ทำการประมวลผลล่วงหน้าเท่านั้นส่งออกไฟล์ที่ประมวลผลล่วงหน้า (ซึ่งจะป้องกันไม่ให้ gcc บ่นว่าไฟล์ว่างไม่ได้คอมไพล์อย่างถูกต้อง)

ทางด้านล่างจะเป็นรายชื่อของไดเรกทอรีรวม:

#include "..." search starts here:
#include <...> search starts here:
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks (framework directory)
End of search list.

หากคุณป้อนไดเร็กทอรีที่แสดงที่นี่ตามลำดับที่แสดงไว้ในไดอะล็อกพา ธ และสัญลักษณ์ของ Eclipse Eclipse CDT ควรจะสามารถค้นหาส่วนหัวมาตรฐานได้และอาจมีส่วนหัวเพิ่มเติมสำหรับระบบปฏิบัติการของคุณ

(ด้วยคำตอบของ devnullสำหรับคำถามที่เกี่ยวข้อง)


มีประโยชน์มากจริงๆ
sancho.s ReinstateMonicaCellio

1

ใน ADT ฉันทำสิ่งต่อไปนี้:

  1. คลิกขวาที่โครงการและเลือกคุณสมบัติ
  2. ขยาย C / C ++ General และเลือก Preprocessor Include Paths, Macros เป็นต้น
  3. เลือกรายการการตั้งค่าผู้ใช้ CDT
  4. เลือกเพิ่ม ... จากเมนูด้านขวามือ
  5. ใน Add Include Directory เปลี่ยน Project Path เป็น File System Path
  6. เรียกดูไดเร็กทอรีที่มีไฟล์รวมของคุณ
  7. กวนและทำซ้ำตามต้องการ

1

โดยปกติ Eclipse ควรจะสามารถแก้ไขไฟล์รวมมาตรฐานได้โดยอัตโนมัติ ทำได้โดยการเรียก gcc และถามการกำหนดค่า เป็นไปได้มากว่า Eclipse ไม่พบ gcc ของคุณ (หรืออย่างน้อยก็ไม่ใช่เวอร์ชันที่คุณใช้ในการคอมไพล์)

แทนที่จะระบุพา ธ มาตรฐานทั้งหมดในการตั้งค่าโปรเจ็กต์คุณอาจต้องการตรวจสอบให้แน่ใจว่า Eclipse พบ gcc เพิ่มไดเร็กทอรีที่พบ gcc ให้กับตัวแปรสภาวะแวดล้อม PATH ก่อนเริ่ม Eclipse

หากคุณต้องการให้โปรเจ็กต์อื่นใช้คอมไพเลอร์ที่แตกต่างกันคุณอาจต้องการปรับแต่งตัวเลือกการค้นพบ สิ่งเหล่านี้ถูกซ่อนไว้โดยค่าเริ่มต้นดังนั้นก่อนอื่นให้เปิดใช้งานจากหน้าต่าง> การตั้งค่า> C / C ++> การตั้งค่าหน้าคุณสมบัติ> แสดงหน้า "ตัวเลือกการค้นพบ" จากนั้นคุณสามารถค้นหาได้ใน C / C ++ Build> Discovery Options ในคุณสมบัติโครงการ


1

ฉันใช้ CodeWarrior IDE ที่ใช้ eclipse สำหรับโครงการฝังตัวและฉันเพิ่งแก้ไขปัญหานี้โดยการลบและเพิ่มแหล่งที่อยู่อีกครั้งใน Project Properities-> C / C ++ General-> Path และ Sybols-> รวมไดเรกทอรี ซึ่งหมายความว่ามีเหตุผลมากมายที่จะรับข้อความ "Unresolved inclusion:" และมีวิธีแก้ไขมากมายเช่นกัน


0

ข้อผิดพลาดที่ฉันได้กำหนดค่าเส้นทางและสัญลักษณ์คือในตอนแรกฉันกำหนดค่าพา ธ รวมสำหรับภาษาอื่น ฉันกำลังทำงานกับ CDT และ Cygwin gnu C ++ ดังนั้นคุณต้องกำหนดค่าสัญลักษณ์และเส้นทางภายใต้ภาษา GNU C ++ป้อนคำอธิบายภาพที่นี่


0

ตั้งค่า${COMMAND}เป็นgccบน Linux ด้วย

ภายใต้:

  • โครงการ
  • คุณสมบัติ
  • C / C ++ ทั่วไป
  • พรีโปรเซสเซอร์ประกอบด้วยพา ธ มาโคร ฯลฯ
  • ผู้ให้บริการ
  • การตั้งค่าคอมไพเลอร์ในตัว CDT GCC
  • คำสั่งเพื่อรับข้อมูลจำเพาะของคอมไพเลอร์

แทนที่:

${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"

กับ:

gcc -std=c99 -E -P -v -dD "${INPUTS}"

หากคุณไม่ทำเช่นนี้ Eclipse stdout จะแสดง:

Unable to find full path for "-E"

และบันทึกภายใต้การ${HOME}/eclipse-workspace/.metadata/.logแสดง:

!ENTRY org.eclipse.cdt.core 4 0 2020-04-23 20:17:07.288
!MESSAGE Error: Cannot run program "-E": Unknown reason

เนื่องจาก${COMMAND} ${FLAGS}ว่างเปล่าดังนั้น Eclipse จึงพยายามเรียกใช้สิ่ง-Eที่มาถัดไป

ฉันสงสัยว่าเราสามารถกำหนดตัวแปรCOMMANDและFLAGSตัวแปรในการตั้งค่าได้อย่างถูกต้องหรือไม่ แต่ฉันพยายามเพิ่มเป็นตัวแปรบิวด์ แต่ก็ไม่ได้ผล

คำถามเวอร์ชัน C ++: จะแก้ "Unresolved inclusion: <iostream>" ในไฟล์ C ++ ใน Eclipse CDT ได้อย่างไร

การทดสอบบน Eclipse 2020-03 (4.15.0), อูบุนตู 19.10 และนี้โครงการ Makefile น้อยที่สุดกับแหล่งที่มีอยู่


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