Lỗi "Bao gồm chưa được giải quyết" với Eclipse CDT cho tiêu đề thư viện tiêu chuẩn C


96

Tôi thiết lập CDT cho eclipse và viết một chương trình hello world C đơn giản:

#include <stdio.h>

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

Chương trình xây dựng và chạy chính xác, nhưng nhật thực vẫn tiếp tục hiển thị dấu chấm hỏi màu vàng này bên cạnh câu lệnh bao gồm "Unresolved inclusion: <stdio.h>"khi tôi đưa chuột qua nó.

Nó không ảnh hưởng đến việc chạy chương trình nhưng tôi thấy nó khá khó chịu.

Có ai có bất kỳ ý tưởng làm thế nào để loại bỏ nó?


2
Bạn sẽ nghĩ rằng ví dụ Hello World sẽ làm điều này cho bạn, hoặc ít nhất là cung cấp một số trợ giúp. Nếu nhật thực không bao gồm một trình biên dịch, tại sao lại không?
Doug Molineux

Câu trả lời:


50

Trình biên dịch mà Eclipse đang sử dụng có thể phân giải các ký hiệu tốt, vì vậy mã sẽ biên dịch tốt.

Nhưng trình hoàn thành mã / lập chỉ mục hoặc bộ tiền xử lý mà Eclipse đang sử dụng không biết stdio.htồn tại ở đâu .

Bạn cần xác định stdio.hvị trí của đường dẫn hệ thống tệp .

Tài liệu Eclipse mô tả điều này trong một số phần dành cho trình biên dịch:

Và nếu trình hoàn thành mã / lập chỉ mục hoặc bộ xử lý tiền xử lý cụ thể cũng không thể định vị stdio.h:

Vị trí chính xác của stdio.hsẽ phụ thuộc vào hệ thống mà bạn định viết mã. Nếu bạn đang viết mã cho cùng một hệ thống mà bạn đang chạy Eclipse, thì vị trí tiêu chuẩn /usr/include/stdio.hdành cho Linux, macOS, Cygwin, v.v.

Nếu bạn đang biên dịch chéo cho một hệ thống đích riêng biệt / từ xa (ví dụ: Android, Raspberry Pi, STM32), thì nó sẽ nằm ở đâu đó trong SDK bạn đã cài đặt cho hệ thống đó. Bạn sẽ cần tham khảo tài liệu SDK cụ thể đó.


2
Cảm ơn vi đa trả lơi. Nhưng đâu là đường dẫn cho Ubuntu 11.10?
Derrick Zhang

Một điều khiến tôi bối rối là tôi phải thêm đường dẫn vào tab "bao gồm", chứ không phải tab "đường dẫn thư viện". Tôi luôn nghĩ rằng "anglebracket" bao gồm "thư viện" bao gồm.
aaaidan

1
Bạn chỉ định nơi tìm tệp tiêu đề (tức là tệp .h) trên tab bao gồm. Bạn cho trình liên kết biết nơi nó có thể tìm thấy các tệp thư viện đã biên dịch trên tab đường dẫn thư viện. Quy ước về dấu ngoặc kép so với dấu ngoặc nhọn có lẽ phụ thuộc vào trình biên dịch nhưng tôi luôn nghĩ về <> nghĩa là tìm kiếm đầu tiên trong vị trí thư viện hệ thống tiêu chuẩn và "" nghĩa là tìm kiếm trong dự án của tôi trước.
Tod,

2
Các trình biên dịch hiện đại không phân biệt giữa dấu ngoặc kép và dấu ngoặc nhọn. Tiêu đề hệ thống tiêu chuẩn thông thường vẫn được đặt trong dấu ngoặc nhọn.
Seppo Enarvi

53

Tôi thấy những câu trả lời này (bao gồm cả câu được chấp nhận) hơi khó hiểu.

Đối với tôi, tôi đã phải thêm đường dẫn nơi đặt stdio.h (như @ardnew đã nói). Trong Eclipse, bạn mở Thuộc tính của dự án, mở rộng "C / C ++ Chung" và chọn "Đường dẫn và ký hiệu".

Đảm bảo rằng bạn đã thêm includedir cho từng ngôn ngữ bạn đang sử dụng. (Trong trường hợp của tôi, tôi chỉ cần thêm nó vào GNU C ++.)

nhập mô tả hình ảnh ở đây


Điều này thật gần với những gì tôi cần! Chỉ cần thay đổi tên người dùng trong đường dẫn.
Lucas

2
Trên OS X bạn có thể cần phải tự cài đặt các công cụ phát triển dòng lệnh (mà đầu tiên yêu cầu cài đặt Xcode) bằng cách sử dụng lệnh /usr/bin/xcode-select --installvà sau đó bạn sẽ có thể chỉ Eclipse tại/usr/include/
RobV

1
Trên Yosemite. Sử dụng Eclipse Juno. Loại này phù hợp với tôi ngoại trừ đường dẫn tôi đưa ra hơi khác (/ Users / SrinivasanNatarajan / android-ndk / platform / android-19 / Arch-arm / usr / include). Mặc dù tất cả các lỗi chưa được giải quyết đã biến mất, tôi vẫn nghi ngờ rằng 'mình đã đặt đúng đường chưa'. "Eclipse thực sự hút". Phải dành hàng giờ để thiết lập IDE để phát triển.
Srinivasan N

1
Cảm ơn. Chỉ có biến thể của bạn đã giúp tôi.
Nikmoon

Trong trường hợp của tôi (với MinGW), đã sử dụng "Hệ thống tệp ..." để thêm thư mục "C: \ MinGW \ include"
Gary99

17

vừa bổ sung thêm kiến ​​thức, tôi vừa làm việc này trên win7 với cygwin.

đây là những gì có vẻ làm việc cho tôi.

bao gồm các đường dẫn cho c:

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

bao gồm các đường dẫn cho 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

điều này giúp tôi có một tập hợp hello world rõ ràng.


Tôi đến từ tương lai. Tôi đã đến để nói lời cảm ơn. Đây thực sự là điều đầu tiên làm việc cho tôi. Tôi chưa bao giờ có một thế giới xin chào khó khăn như vậy. Cảm ơn ngài.
nVentimiglia

17

Đi tới Dự án> Thuộc tính> C / C ++ Chung> Bao gồm tiền xử lý> Nhà cung cấp và chọn cả hai:

  • "Cài đặt trình biên dịch tích hợp CDT GCC"
  • "Cài đặt trình biên dịch tích hợp CDT CROSS GCC"

Đối với mỗi một trong số đó, hãy chọn mục nhập phụ: "Sử dụng nhà cung cấp toàn cầu được chia sẻ giữa các dự án".

Đã thử nghiệm trên Eclipse 4.8.0 trong Ubuntu 16.04 với C và C ++ hello world.


3
... và chọn hộp "Sử dụng nhà cung cấp toàn cầu được chia sẻ giữa các dự án"
Urhixidur

Tôi cũng đã phải kiểm tra "Sử dụng nhà cung cấp toàn cầu được chia sẻ giữa các dự án" như @Urhixidur đã đề cập. Tôi đã thử một số lượng lớn các giải pháp cho lỗi được xây dựng trong nhật thực này và đây là giải pháp thực sự hiệu quả với tôi. Những dòng đó thật khó chịu. Cảm ơn!
CodeGuyRoss

10
  • Chọn Tệp >> Dự án mới
  • Trong Project Wizard, chọn C / C ++ >> C ++ Project
  • Trong phần "Loại dự án", chọn " Makefile Project >> Hello world C ++ Project "
  • Trong phần "Toolchains", chọn " Linux GCC "

Nó có thể giải quyết vấn đề. (Xin lỗi vì tiếng Anh kém)


1
Tôi đã làm những điều đó, nhưng nó vẫn không nhận ra rằng các tiêu đề nằm trong / usr / include.
người đàn ông không gian cardiff

Dễ dàng hơn nhiều so với việc thêm từng bao gồm chính bạn. Tôi đã sử dụng tùy chọn plattform chéo, cũng hoạt động tốt (trên Ubuntu)
panmari

Rất hữu ích! Tiếng Anh tuyệt vời.
AturSams

Làm thế nào để bạn thực hiện điều này trên một dự án hiện có?
Jay Elston

4

Tôi đang sử dụng Eclipse với Cygwin và điều này phù hợp với tôi:

Đi tới Dự án> Thuộc tính> C / C ++ Chung> Tiền xử lý Bao gồm ...> Nhà cung cấp và chọn "Cài đặt trình biên dịch tích hợp CDT GCC Cygwin [Đã chia sẻ]".


4

Tôi đang làm việc với nhiều cấu hình trình biên dịch chéo , nơi tôi cần sử dụng các vị trí khác nhau cho tệp tiêu đề STD (và các biến môi trường khác).

Giải pháp là thiết lập trình chỉ mục để nó sử dụng cấu hình hoạt động.
Thật không may do một số lỗi trong eclipse , tùy chọn không được lưu trữ cục bộ, vì vậy bạn phải sử dụng cấu hình không gian làm việc nếu bạn muốn lưu cấu hình khi bạn mở lại eclipse.

Window -> Preferences -> C / C ++ -> Indexer -> Sử dụng cấu hình xây dựng hoạt động

Điều này sẽ làm cho eclipse sử dụng đúng trình biên dịch được thiết lập với cấu hình Cross GCC đang hoạt động của dự án.


Gặp vấn đề tương tự, biên dịch chéo sang ESP8266. Thật tệ là trang này quá đông, phải tự mình tìm ra.
Michael Böckling

Cảm ơn vì điều này. Tôi cũng gặp sự cố này phát triển sau khi tôi tạo nhiều cấu hình trình biên dịch chéo (cho các phiên bản khác nhau của SDK nhúng ESP32 "ESP-IDF"). Người lập chỉ mục không chọn các tiêu đề chính xác. Cài đặt này dường như cho phép Người lập chỉ mục sử dụng cùng một môi trường với cấu hình đang hoạt động, trong trường hợp của tôi cho phép Người lập chỉ mục chọn đúng tiêu đề.
davidA

3

Như câu trả lời đầu tiên lưu ý, cần phải chỉ định vị trí của các thư mục xây dựng, có thể được thêm vào thông qua hộp thoại bằng cách nhấp chuột phải vào dự án và chọn Thuộc tính-> C / C ++ Chung-> Đường dẫn và Biểu tượng.

Câu hỏi còn lại là những đường dẫn nào cần được thêm vào.

Nếu bạn đã thiết lập gcc đúng cách cho quyền truy cập dòng lệnh và cần biết đường dẫn bao gồm mặc định mà nó sử dụng là gì, chỉ cần hỏi nó; tùy thuộc vào ngôn ngữ bạn quan tâm, hãy sử dụng:

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

... điều này sẽ liệt kê các cài đặt trình biên dịch mặc định được sử dụng khi gọi gcc (và lệnh này cũng hoạt động nếu "gcc" thực sự là một bí danh cho clang, như trên OSX).

/dev/null được sử dụng như một tệp trống - chúng tôi đang yêu cầu gcc phân tích cú pháp một tệp trống

-x <language> chỉ định ngôn ngữ để biên dịch là cần thiết vì chúng tôi không sử dụng tệp có phần mở rộng chỉ định ngôn ngữ

-v đầu ra dài dòng, bao gồm xuất ra các đường dẫn bao gồm

-E chỉ thực hiện tiền xử lý, xuất ra tệp đã xử lý trước (điều này ngăn gcc phàn nàn rằng tệp trống không biên dịch chính xác)

Ở phía dưới cùng sẽ là danh sách các thư mục bao gồm:

#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.

Nếu bạn nhập các thư mục được liệt kê ở đây, theo thứ tự được liệt kê, vào hộp thoại đường dẫn và ký hiệu của Eclipse, Eclipse CDT sẽ có thể tìm thấy các tiêu đề chuẩn và có lẽ một số tiêu đề bổ sung dành riêng cho hệ điều hành của bạn.

(Cảm ơn câu trả lời của devnull cho một câu hỏi liên quan.)


RẤT hữu ích thực sự.
sancho.s ReinstateMonicaCellio

1

Trong ADT, tôi đã làm như sau:

  1. nhấp chuột phải vào dự án và chọn Thuộc tính
  2. mở rộng C / C ++ Chung và chọn Bộ tiền xử lý Bao gồm Đường dẫn, Macro, v.v.
  3. chọn các mục cài đặt người dùng CDT
  4. chọn Thêm ... từ menu bên phải
  5. Trong Thư mục Thêm Bao gồm thay đổi Đường dẫn Dự án thành Đường dẫn Hệ thống Tệp
  6. Duyệt đến thư mục chứa các tệp bao gồm của bạn
  7. khuấy và lặp lại nếu cần

1

Thông thường, Eclipse sẽ có thể tự động giải quyết các tệp bao gồm tiêu chuẩn. Nó thực hiện điều này bằng cách gọi gcc và hỏi cấu hình của nó. Nhiều khả năng Eclipse không tìm thấy gcc của bạn (hoặc ít nhất không phải là phiên bản bạn sử dụng để biên dịch).

Thay vì chỉ định tất cả các đường dẫn bao gồm tiêu chuẩn trong cài đặt dự án, bạn có thể muốn đảm bảo rằng Eclipse tìm thấy gcc. Thêm thư mục nơi gcc được tìm thấy vào biến môi trường PATH trước khi khởi động Eclipse.

Nếu bạn muốn các dự án khác nhau sử dụng các trình biên dịch khác nhau, thì bạn có thể muốn tinh chỉnh các tùy chọn khám phá. Những thứ này bị ẩn theo mặc định, vì vậy trước tiên hãy bật chúng từ Window> Preferences> C / C ++> Property Pages Settings> Display "Discovery Options" trang. Sau đó, bạn có thể tìm thấy chúng trong C / C ++ Build> Discovery Options trong thuộc tính dự án.


1

Tôi đang sử dụng CodeWarrior IDE dựa trên nhật thực cho các dự án nhúng và tôi vừa giải quyết vấn đề này bằng cách xóa và thêm lại các địa chỉ nguồn vào Project Properities-> C / C ++ General-> Path and Sybols-> include Directories. Điều này có nghĩa là có rất nhiều lý do để nhận thông báo "Bao gồm chưa được giải quyết:" và cũng có rất nhiều giải pháp.


0

Một lỗi mà tôi đã định cấu hình Đường dẫn và Biểu tượng là ban đầu tôi đã định cấu hình các đường dẫn bao gồm cho một ngôn ngữ khác. Tôi đang làm việc với CDT và Cygwin gnu C ++. Vì vậy, bạn phải cấu hình các ký hiệu và đường dẫn theo ngôn ngữ GNU C ++.nhập mô tả hình ảnh ở đây


0

Cũng được đặt ${COMMAND}thành gcctrên Linux

Dưới:

  • Dự án
  • Tính chất
  • C / C ++ Chung
  • Bộ tiền xử lý Bao gồm Đường dẫn, Macro, v.v.
  • Nhà cung cấp
  • Cài đặt trình biên dịch tích hợp CDT GCC
  • Lệnh nhận thông số kỹ thuật của trình biên dịch

Thay thế:

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

với:

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

Nếu bạn không làm điều này, biểu tượng Eclipse sẽ hiển thị:

Unable to find full path for "-E"

và các bản ghi dưới ${HOME}/eclipse-workspace/.metadata/.logchương trình:

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

bởi vì ${COMMAND} ${FLAGS}nó trống, và do đó Eclipse cố gắng thực thi -Ecái đến tiếp theo.

Tôi tự hỏi liệu chúng ta có thể xác định đúng các biến COMMANDFLAGSbiến trên cài đặt hay không, nhưng tôi đã cố gắng thêm chúng làm biến xây dựng và nó không hoạt động.

Phiên bản C ++ của câu hỏi: Làm thế nào để giải quyết "Bao gồm chưa được giải quyết: <iostream>" trong tệp C ++ trong Eclipse CDT?

Đã thử nghiệm trên Eclipse 2020-03 (4.15.0), Ubuntu 19.10 và dự án Makefile tối thiểu này với các nguồn hiện có .


0

Bạn kiểm tra xem nó có được biên dịch từ dòng lệnh không? Để tôi giúp trên Linux, apt cài đặt libc-dev.

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.