Error "Penyertaan tidak terselesaikan" dengan Eclipse CDT untuk header library standar C.

96

Saya menyiapkan CDT untuk gerhana dan menulis program hello world C sederhana:

#include <stdio.h>

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

Program ini dibangun dan berjalan dengan benar, tetapi gerhana tetap menampilkan tanda tanya kuning ini di samping pernyataan inklusi yang mengatakan "Unresolved inclusion: <stdio.h>"ketika saya meletakkan mouse di atasnya.

Itu tidak mempengaruhi jalannya program tetapi saya merasa agak menjengkelkan.

Apakah ada yang tahu cara menghapusnya?

Derrick Zhang
sumber
2
Anda akan mengira bahwa contoh Hello World akan melakukan ini untuk Anda, atau setidaknya memberikan bantuan. Jika eclipse tidak menyertakan kompiler, mengapa tidak?
Doug Molineux

Jawaban:

50

Kompilator yang digunakan Eclipse mampu menyelesaikan simbol dengan baik, jadi kode akan dikompilasi dengan baik.

Namun pelengkapan kode / pengindeks atau preprocessor yang digunakan Eclipse tidak mengetahui stdio.hkeberadaannya.

Anda perlu menentukan jalur sistem file di mana stdio.hlokasinya.

Dokumentasi Eclipse menjelaskan hal ini dalam beberapa bagian untuk compiler:

Dan jika pelengkapan kode / pengindeks atau preprocessor secara khusus juga tidak dapat menemukan stdio.h:

Lokasi persisnya stdio.hakan bergantung pada sistem yang ingin Anda tulis kodenya. Jika Anda menulis kode untuk sistem yang sama dengan tempat Anda menjalankan Eclipse, maka lokasi standarnya adalah /usr/include/stdio.huntuk Linux, macOS, Cygwin, dll.

Jika Anda melakukan kompilasi silang untuk sistem target terpisah / jarak jauh (mis. Android, Raspberry Pi, STM32), maka itu akan ditempatkan di suatu tempat di SDK yang Anda instal untuk sistem itu. Anda perlu merujuk ke dokumentasi SDK tertentu.

baru
sumber
2
Terima kasih balasannya. Tapi di mana jalur untuk Ubuntu 11.10?
Derrick Zhang
Satu hal yang membuat saya bingung adalah bahwa saya harus menambahkan jalur ke tab "termasuk", bukan tab "jalur perpustakaan". Saya selalu berpikir bahwa "anglebracket" termasuk adalah "perpustakaan" termasuk.
aaaidan
1
Anda menentukan di mana menemukan file header (mis. File .h) pada tab include. Anda memberi tahu linker di mana ia dapat menemukan file perpustakaan yang dikompilasi pada tab jalur perpustakaan. Konvensi tanda kutip vs tanda kurung siku mungkin bergantung pada kompiler tetapi saya selalu menganggap <> sebagai arti, lihat dulu di tempat pustaka sistem standar dan "" sebagai arti mencari di proyek saya terlebih dahulu.
Tod
2
Penyusun modern tidak membedakan antara tanda kutip dan tanda kurung sudut. Header sistem standar konvensional masih ditempatkan dalam tanda kurung sudut.
Seppo Enarvi
53

Saya menemukan jawaban ini (termasuk yang diterima) agak samar.

Bagi saya, saya harus menambahkan jalur tempat stdio.h berada (seperti yang dikatakan @ardnew). Di Eclipse, Anda membuka Properti proyek Anda, perluas "C / C ++ General" dan pilih "Paths and Symbols".

Pastikan Anda telah menambahkan includedir untuk setiap bahasa yang Anda gunakan. (Dalam kasus saya, saya hanya perlu menambahkannya ke GNU C ++.)

masukkan deskripsi gambar di sini

aaaidan
sumber
Ini sangat dekat dengan apa yang saya butuhkan! Hanya harus mengubah nama pengguna di jalan.
Lucas
2
Di OS X Anda mungkin perlu menginstal secara manual alat pengembang baris perintah (yang pertama kali memerlukan penginstalan Xcode) menggunakan perintah /usr/bin/xcode-select --installdan kemudian Anda dapat mengarahkan Eclipse ke/usr/include/
RobV
1
Di Yosemite. Menggunakan Eclipse Juno. Jenis ini berfungsi untuk saya kecuali jalur yang saya berikan sedikit berbeda (/ Users / SrinivasanNatarajan / android-ndk / platforms / android-19 / arch-arm / usr / include). Meskipun semua kesalahan yang belum terselesaikan hilang, saya masih ragu bahwa 'apakah saya telah menetapkan jalur yang benar'. "Eclipse benar-benar menyebalkan". Harus menghabiskan waktu berjam-jam untuk menyiapkan IDE untuk pengembangan.
Srinivasan N
1
Terima kasih. Hanya varian Anda yang membantu saya.
Nikmoon
Dalam kasus saya (dengan MinGW), menggunakan "Sistem file ..." untuk menambahkan direktori "C: \ MinGW \ include"
Gary99
17

hanya menambah basis pengetahuan, saya baru saja melakukan ini di win7 dengan cygwin.

inilah yang tampaknya berhasil bagi saya.

sertakan jalur untuk c:

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

sertakan jalur untuk 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

ini memberi saya kompilasi bersih hello world.

Ray Tayek
sumber
Saya dari masa depan. Saya datang untuk mengucapkan terima kasih. Ini sebenarnya hal pertama yang berhasil bagi saya. Aku belum pernah mengalami dunia halo yang begitu sulit. Terima kasih Pak.
nVentimiglia
17

Buka Project> Properties> C / C ++ General> Preprocessor Includes> Providers dan pilih keduanya:

  • "Pengaturan Kompilator Built-in CDT GCC"
  • "CDT CROSS GCC Built-in Compiler Settings"

Untuk masing-masing proyek juga pilih sub-entri: "Gunakan penyedia global yang dibagi antar proyek".

Diuji pada Eclipse 4.8.0 di Ubuntu 16.04 dengan C dan C ++ hello world.

Mike B
sumber
3
... dan centang kotak "Gunakan penyedia global yang dibagi antar proyek"
Urhixidur
Saya juga harus memeriksa "Gunakan penyedia global yang dibagikan antar proyek" seperti yang disebutkan @Urhixidur. Saya mencoba sejumlah besar solusi untuk kesalahan gerhana bawaan ini dan inilah yang benar-benar berhasil untuk saya. Garis-garis itu mengganggu. Terima kasih!
CodeGuyRoss
10
  • Pilih File >> Proyek Baru
  • Di Project Wizard, pilih C / C ++ >> C ++ Project
  • Di bagian "Jenis proyek", pilih " Proyek Makefile >> Proyek C ++ Hello world "
  • Di bagian "Toolchain", pilih " Linux GCC "

Itu bisa menyelesaikan masalah. (Maafkan saya karena bahasa Inggris yang buruk)

Nader Aryabarzan
sumber
1
Saya melakukan hal-hal itu, tetapi masih tidak mengenali bahwa headernya ada di / usr / include.
Cardiff space man
Jauh lebih mudah daripada menambahkan setiap termasuk diri Anda sendiri. Saya memang menggunakan opsi cross plattform, yang juga berfungsi dengan baik (di Ubuntu)
panmari
Sangat membantu! Bahasa Inggris yang bagus.
AturSams
Bagaimana Anda melakukan ini pada proyek yang sudah ada?
Jay Elston
4

Saya menggunakan Eclipse dengan Cygwin dan ini berhasil untuk saya:

Buka Project> Properties> C / C ++ General> Preprocessor Includes ...> Providers dan pilih "CDT GCC Built-in Compiler Settings Cygwin [Shared]".

superm0
sumber
4

Saya bekerja dengan beberapa konfigurasi kompilator silang , di mana saya perlu menggunakan lokasi berbeda untuk file header STD (dan variabel lingkungan lainnya).

Solusinya adalah mengatur pengindeks sehingga menggunakan konfigurasi aktif.
Sayangnya karena beberapa bug di gerhana , opsi tersebut tidak disimpan secara lokal, jadi Anda harus menggunakan ruang kerja konfigurasi jika ingin menyimpan konfigurasi tersebut saat Anda membuka eclipse lagi.

Window -> Preferences -> C / C ++ -> Indexer -> Gunakan konfigurasi build aktif

Ini akan membuat eclipse menggunakan kompiler yang tepat yang diatur dengan konfigurasi Cross GCC aktif proyek.

Yochai Timmer
sumber
Punya masalah yang sama, melakukan kompilasi silang ke ESP8266. Sayang sekali halaman ini begitu penuh, harus mencari tahu sendiri.
Michael Böckling
Terima kasih untuk ini. Saya juga mengalami masalah ini berkembang setelah saya membuat beberapa konfigurasi kompilator silang (untuk versi berbeda dari SDK tertanam ESP32 "ESP-IDF"). Header yang benar tidak diambil oleh Pengindeks. Pengaturan ini tampaknya memungkinkan Pengindeks menggunakan lingkungan yang sama dengan konfigurasi aktif, yang dalam kasus saya memungkinkannya untuk mengambil header yang tepat.
davidA
3

Sebagai catatan jawaban teratas, penting untuk menentukan di mana folder build berada, yang dapat ditambahkan melalui dialog yang dicapai dengan mengklik kanan proyek, dan memilih Properties-> C / C ++ General-> Paths and Symbols.

Pertanyaan yang tersisa adalah jalur apa yang perlu ditambahkan.

Jika Anda telah menyiapkan gcc dengan benar untuk akses baris perintah, dan perlu mengetahui jalur penyertaan default yang digunakannya, tanyakan saja; tergantung pada bahasa yang Anda minati, gunakan:

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

... ini akan mencantumkan pengaturan compiler default yang digunakan saat menjalankan gcc (dan perintah ini juga berfungsi jika "gcc" benar-benar merupakan alias untuk clang, seperti pada OSX).

/dev/null digunakan sebagai file kosong - kami memberi tahu gcc untuk mengurai file kosong

-x <language> menentukan bahasa yang akan dikompilasi, diperlukan karena kami tidak menggunakan file dengan ekstensi yang menentukan bahasa

-v keluaran verbose, yang mencakup keluaran jalur include

-E hanya lakukan praproses, keluarkan file yang telah diproses (ini mencegah gcc mengeluh bahwa file kosong tidak dapat dikompilasi dengan benar)

Di bagian bawah akan ada daftar direktori penyertaan:

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

Jika Anda memasukkan direktori yang terdaftar di sini, dalam urutan yang terdaftar, ke dalam dialog jalur dan simbol Eclipse, Eclipse CDT seharusnya dapat menemukan header standar, dan mungkin beberapa header tambahan khusus untuk OS Anda.

(Dengan terima kasih atas jawaban devnull untuk pertanyaan terkait.)

Theodore Murdock
sumber
SANGAT berguna memang.
sancho.s ReinstateMonicaCellio
1

Di ADT saya melakukan hal berikut:

  1. klik kanan pada proyek dan pilih Properties
  2. perluas C / C ++ General dan pilih Preprocessor Include Paths, Macro etc.
  3. pilih CDT User Setting Entries
  4. pilih Add ... dari menu sebelah kanan
  5. Di Tambahkan Sertakan Direktori, ubah Jalur Proyek ke Jalur Sistem File
  6. Jelajahi direktori yang berisi file include Anda
  7. aduk dan ulangi sesuai kebutuhan
pengguna330844
sumber
1

Biasanya, Eclipse harus dapat secara otomatis menyelesaikan file penyertaan standar. Ini dilakukan dengan memanggil gcc dan menanyakan konfigurasinya. Kemungkinan besar Eclipse tidak menemukan gcc Anda (atau setidaknya bukan versi yang Anda gunakan untuk mengompilasi).

Daripada menentukan semua jalur penyertaan standar di setelan proyek, Anda mungkin ingin memastikan Eclipse menemukan gcc. Tambahkan direktori tempat gcc ditemukan ke variabel lingkungan PATH sebelum memulai Eclipse.

Jika Anda ingin proyek yang berbeda menggunakan kompiler yang berbeda, maka Anda mungkin ingin mengubah opsi penemuan. Ini disembunyikan secara default, jadi pertama-tama aktifkan dari Window> Preferences> C / C ++> Property Pages Settings> Tampilkan halaman "Discovery Options". Kemudian Anda dapat menemukannya di bawah C / C ++ Build> Opsi Penemuan di properti proyek.

Seppo Enarvi
sumber
1

Saya menggunakan CodeWarrior IDE berbasis eclipse untuk proyek tertanam dan saya baru saja memecahkan masalah ini dengan menghapus dan menambahkan lagi alamat sumber ke Project Properities-> C / C ++ General-> Path and Sybols-> Include Directories. Artinya, ada banyak alasan untuk menerima pesan "Penyertaan yang tidak terselesaikan:" dan ada banyak solusi juga.

Enes Akyay
sumber
0

Kesalahan yang saya alami saat mengonfigurasi Jalur dan Simbol adalah awalnya saya mengonfigurasi jalur penyertaan untuk bahasa yang berbeda. Saya bekerja dengan CDT dan Cygwin gnu C ++. Jadi, Anda harus mengkonfigurasi simbol dan jalur di bawah bahasa GNU C ++.masukkan deskripsi gambar di sini

rodolk
sumber
0

Juga diatur ${COMMAND}ke gccdi Linux

Dibawah:

  • Proyek
  • Properti
  • C / C ++ Umum
  • Preprocessor Sertakan Paths, Macro, dll.
  • Penyedia
  • Pengaturan Kompilator Built-in CDT GCC
  • Perintah untuk mendapatkan spesifikasi compiler

Menggantikan:

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

dengan:

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

Jika Anda tidak melakukan ini, Eclipse stdout menunjukkan:

Unable to find full path for "-E"

dan log di bawah ${HOME}/eclipse-workspace/.metadata/.logacara:

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

karena ${COMMAND} ${FLAGS}kosong, sehingga Eclipse mencoba mengeksekusi perintah -Eberikutnya.

Saya ingin tahu apakah kita dapat mendefinisikan COMMANDdanFLAGS variabel pada pengaturan, tetapi saya mencoba menambahkannya sebagai variabel build dan tidak berhasil.

Versi C ++ dari pertanyaan: Bagaimana mengatasi "Inklusi yang belum terselesaikan: <iostream>" dalam file C ++ di Eclipse CDT?

Diuji pada Eclipse 2020-03 (4.15.0), Ubuntu 19.10, dan proyek Makefile minimal ini dengan sumber yang ada .

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
0

Apakah Anda memeriksa apakah itu dikompilasi dari baris perintah? Bagi saya membantu di Linux, apt install libc-dev.

Jan B Noir
sumber