C standart kitaplık başlıkları için Eclipse CDT ile "çözülmemiş dahil etme" hatası


97

Tutulma için CDT'yi kurdum ve basit bir merhaba dünya C programı yazdım:

#include <stdio.h>

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

Program düzgün bir şekilde oluşturuluyor ve çalışıyor, ancak eclipse, "Unresolved inclusion: <stdio.h>"fareyi üzerine koyduğumda , dahil etme ifadesinin yanında bu sarı soru işaretini göstermeye devam ediyor .

Programın çalışmasını etkilemiyor ama oldukça can sıkıcı buluyorum.

Nasıl çıkarılacağı hakkında bir fikri olan var mı?


2
Merhaba Dünya örneğinin bunu sizin için yapacağını veya en azından biraz yardım sağlayacağını düşünürdünüz. Eclipse bir derleyici içermiyorsa, neden yok?
Doug Molineux

Yanıtlar:


52

Eclipse'in kullandığı derleyici, sembolleri gayet iyi çözebilir, bu nedenle kod iyi bir şekilde derlenir.

Ancak Eclipse'in kullandığı kod tamamlama / dizin oluşturucu veya önişlemci nerede olduğunu bilmiyor stdio.h.

Bulunduğu dosya sistemi yolunu belirtmeniz gerekir stdio.h.

Eclipse belgeleri bunu derleyici için birkaç bölümde açıklar:

Ve eğer kod tamamlama / dizin oluşturucu veya önişlemci özellikle de bulamıyorsa stdio.h:

Tam konumu stdio.h, kodunu yazmayı düşündüğünüz sisteme bağlı olacaktır. Eclipse'i çalıştırdığınız aynı sistem için kod yazıyorsanız, standart konum /usr/include/stdio.hLinux, macOS, Cygwin vb. İçindir.

Ayrı / uzak bir hedef sistem için çapraz derleme yapıyorsanız (örn. Android, Raspberry Pi, STM32), o sistem için kurduğunuz SDK'da bir yere yerleştirilecektir. Söz konusu SDK belgelerine başvurmanız gerekecektir.


2
Yanıt için teşekkürler. Peki Ubuntu 11.10'un yolu nerede?
Derrick Zhang

Kafamı karıştıran bir şey, yolu "kütüphane yolları" sekmesi yerine "içerir" sekmesine eklemem gerekti. Her zaman "köşeli ayraç" ın "kütüphane" içerdiğini düşünmüşümdür.
aaaidan

1
İçerenler sekmesinde başlık dosyalarının (yani .h dosyaları) nerede bulunacağını belirtirsiniz. Bağlayıcıya, kitaplık yolu sekmesinde derlenmiş kitaplık dosyalarını nerede bulabileceğini söylersiniz. Tırnakların ve açılı parantezlerin kuralı muhtemelen derleyiciye bağlıdır, ancak ben her zaman <> 'i ilk önce standart sistem kitaplığı yerine bak ve "" projeme ilk bakma anlamında düşünüyorum.
Tod

2
Modern derleyiciler, tırnak işaretleri ve köşeli parantezler arasında ayrım yapmaz. Geleneksel olarak standart sistem başlıkları yine de köşeli parantez içine yerleştirilir.
Seppo Enarvi

54

Bu cevapları (kabul edilen cevap dahil) biraz şifreli buldum.

Benim için stdio.h'nin bulunduğu yolu eklemem gerekiyordu (@ardnew'in dediği gibi). Eclipse'de, projenizin Özelliklerini açın, "C / C ++ Genel" i genişletin ve "Yollar ve Semboller" i seçin.

Kullandığınız includeher dil için dizini eklediğinizden emin olun . (Benim durumumda, onu GNU C ++ 'ya eklemem gerekiyordu.)

görüntü açıklamasını buraya girin


Bu, ihtiyacım olan şeye ürkütücü bir şekilde yakın! Sadece yoldaki kullanıcı adını değiştirmek zorunda kaldı.
Lucas

2
OS X'te, komutu kullanarak komut satırı geliştirici araçlarını (ilk önce /usr/bin/xcode-select --install/usr/include/
Xcode'u

1
Yosemite'de. Eclipse Juno'yu kullanma. Verdiğim yolun biraz farklı olması dışında bu tür bir iş benim için çalıştı (/ Kullanıcılar / SrinivasanNatarajan / android-ndk / platformlar / android-19 / arch-arm / usr / include). Çözülmemiş tüm hatalar ortadan kalkmış olsa da hala 'doğru yolu belirledim mi' konusunda bir şüphem var. "Eclipse gerçekten berbat". IDE'yi geliştirme için kurmak için saatler harcamak zorunda kaldı.
Srinivasan K

1
Teşekkürler. Sadece varyantınız bana yardım etti.
Nikmoon

Benim durumumda (MinGW ile), "C: \ MinGW \ include" dizinini eklemek için "Dosya sistemi ..." kullanıldı
Gary99

17

bilgi tabanına ek olarak, bunu cygwin ile win7'de yaptım.

bu benim için işe yarıyor gibi görünüyor.

c için yolları dahil et:

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

c ++ için yolları içerir:

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

bu bana temiz bir merhaba dünya derlemesi getiriyor.


Ben gelecekten geliyorum Teşekkür etmeye geldim Bu aslında benim için işe yarayan ilk şey. Hiç bu kadar zor bir merhaba dünyam olmadı. Teşekkürler bayım.
nVentimiglia

17

Proje> Özellikler> C / C ++ Genel> Ön İşlemci İçerir> Sağlayıcılar'a gidin ve ikisini de seçin:

  • "CDT GCC Yerleşik Derleyici Ayarları"
  • "CDT CROSS GCC Yerleşik Derleyici Ayarları"

Bunların her biri için ayrıca alt girişi seçin: "Projeler arasında paylaşılan global sağlayıcıyı kullan".

Ubuntu 16.04'te Eclipse 4.8.0'da C ve C ++ merhaba dünyası ile test edilmiştir.


3
... ve "Projeler arasında paylaşılan küresel sağlayıcıyı kullan" kutusunu işaretleyin
Urhixidur

@Urhixidur'un da belirttiği gibi "Projeler arasında paylaşılan küresel sağlayıcıyı kullan" seçeneğini de kontrol etmem gerekiyordu. Bu yerleşik tutulma hatası için çok sayıda çözüm denedim ve bu benim için gerçekten işe yarayan çözüm. Bu çizgiler can sıkıcıydı. Teşekkürler!
CodeGuyRoss

10
  • Dosya Seç >> Yeni Proje
  • Proje Sihirbazı'nda C / C ++ >> C ++ Projesi'ni seçin
  • "Proje türü" bölümünde, " Makefile Projesi >> Merhaba dünya C ++ Projesi " ni seçin.
  • "Araç Zincirleri" bölümünde, " Linux GCC " yi seçin

Sorunu çözebilir. (Kötü İngilizce için özür dilerim)


1
Bunları yaptım ama yine de başlıkların / usr / include içinde olduğunu anlamadı.
cardiff uzay adamı

Kendinizi içeren her bir tek tek eklemekten çok daha kolay. (Ubuntu'da) iyi çalışan çapraz platform seçeneğini kullandım
panmari

Çok yararlı! Harika İngilizce.
AturSams

Bunu mevcut bir projede nasıl yaparsınız?
Jay Elston

4

Eclipse'i Cygwin ile kullanıyorum ve bu benim için çalıştı:

Proje> Özellikler> C / C ++ Genel> Önişlemci İçerir ...> Sağlayıcılar seçeneğine gidin ve "CDT GCC Yerleşik Derleyici Ayarları Cygwin [Paylaşılan]" seçeneğini seçin.


4

STD başlık dosyaları (ve diğer ortam değişkenleri) için farklı konumlar kullanmam gereken çoklu çapraz derleyici yapılandırmalarıyla çalışıyorum .

Çözüm, indeksleyiciyi aktif yapılandırmayı kullanacak şekilde ayarlamaktı.
Ne yazık ki , tutulmadaki bazı hatalar nedeniyle , seçenek yerel olarak depolanmamaktadır, bu nedenle tutulmayı tekrar açtığınızda yapılandırmayı kaydetmek istiyorsanız çalışma alanı yapılandırmasını kullanmanız gerekir .

Pencere -> Tercihler -> C / C ++ -> Dizin Oluşturucu -> Etkin derleme yapılandırmasını kullan

Bu, eclipse'in projenin etkin Cross GCC yapılandırmasıyla ayarlanan doğru derleyiciyi kullanmasını sağlayacaktır.


ESP8266'ya çapraz derleme aynı sorunu yaşıyordu. Bu sayfanın çok kalabalık olması çok kötü, kendim halletmek zorunda kaldım.
Michael Böckling

Bunun için teşekkür ederim. Bu sorun, birden çok çapraz derleyici yapılandırması oluşturduktan sonra da gelişti (ESP32 "ESP-IDF" gömülü SDK'nın farklı sürümleri için). Doğru başlıklar Dizin Oluşturucu tarafından alınmıyordu. Bu ayar, Dizin Oluşturucunun etkin yapılandırma ile aynı ortamı kullanmasına izin veriyor gibi görünüyor, bu da benim durumumda doğru başlıkları almasına izin verdi.
Davida

3

En iyi cevapların notu, projeye sağ tıklanarak ve Özellikler-> C / C ++ Genel-> Yollar ve Semboller seçilerek ulaşılan bir iletişim kutusu aracılığıyla eklenebilen yapı klasörlerinin nerede bulunduğunu belirtmek gerekir.

Geriye kalan soru, hangi yolların eklenmesi gerektiğidir.

Gcc'yi komut satırı erişimi için doğru bir şekilde ayarladıysanız ve kullandığı varsayılan dahil etme yollarının ne olduğunu bilmeniz gerekiyorsa, ona sormanız yeterlidir; ilgilendiğiniz dile bağlı olarak şunu kullanın:

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

... bu, gcc çağrılırken kullanılan varsayılan derleyici ayarlarını listeleyecektir (ve bu komut, "gcc" gerçekten clang için bir takma ad ise, OSX'te olduğu gibi çalışır).

/dev/null boş bir dosya olarak kullanılıyor - gcc'ye boş bir dosyayı ayrıştırmasını söylüyoruz

-x <language> gerekli şekilde derlenecek dili belirtir çünkü dili belirten bir uzantıya sahip bir dosya kullanmıyoruz

-v İçerme yollarının çıktısının alınmasını içeren ayrıntılı çıktı

-E yalnızca ön işleme gerçekleştirin, önceden işlenmiş dosyanın çıktısını alın (bu, gcc'nin boş bir dosyanın doğru şekilde derlenmediğinden şikayet etmesini önler)

Aşağıya doğru, içerme dizinlerinin listesi olacaktır:

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

Burada listelenen dizinleri listelenen sırayla Eclipse'in yolları ve sembolleri iletişim kutusuna girerseniz, Eclipse CDT'nin standart başlıkları ve belki de işletim sisteminize özgü bazı ek başlıkları bulabilmesi gerekir.

( İlgili bir soruya devnull'un cevabı sayesinde .)


Gerçekten çok kullanışlı.
sancho.s ReinstateMonicaCellio

1

ADT'de şunları yaptım:

  1. projeye sağ tıklayın ve Özellikler'i seçin
  2. C / C ++ Genel'i genişletin ve Ön İşlemci Yolları, Makroları vb. Dahil Et'i seçin.
  3. CDT Kullanıcı Ayarı Girişlerini seçin
  4. sağdaki menüden Ekle ... seçeneğini seçin
  5. Dizin Ekle'de Dosya Sistemi Yoluna Proje Yolunu değiştirin
  6. Dahil etme dosyalarınızı içeren dizine gidin
  7. gerektiği kadar karıştırın ve tekrarlayın

1

Normalde, Eclipse standart içerme dosyalarını otomatik olarak çözebilmelidir. Bunu gcc'yi arayarak ve yapılandırmasını sorarak yapar. Büyük olasılıkla Eclipse, gcc'nizi (veya en azından derlemek için kullandığınız sürümü bulamıyor).

Proje ayarlarında tüm standart içerme yollarını belirtmek yerine, muhtemelen Eclipse'in gcc'yi bulduğundan emin olmak istersiniz. Eclipse'i başlatmadan önce gcc'nin bulunduğu dizini PATH ortam değişkenine ekleyin.

Farklı projelerin farklı derleyiciler kullanmasını istiyorsanız, keşif seçeneklerinde ince ayar yapmak isteyebilirsiniz. Bunlar varsayılan olarak gizlidir, bu nedenle önce bunları Pencere> Tercihler> C / C ++> Özellik Sayfaları Ayarları> "Keşif Seçenekleri" sayfasını Görüntüle'den etkinleştirin. Daha sonra bunları proje özelliklerinde C / C ++ Build> Discovery Options altında bulabilirsiniz.


1

Gömülü projeler için tutulma tabanlı CodeWarrior IDE kullanıyorum ve bu sorunu Proje Özellikleri-> C / C ++ Genel-> Yol ve Sybols-> Dizinleri Dahil Et'e kaynak adreslerini silip tekrar ekleyerek çözdüm. Bu, "Çözülmemiş dahil etme:" mesajını almak için pek çok neden olduğu ve pek çok çözüm olduğu anlamına gelir.


0

Yolları ve Sembolleri yapılandırırken yaptığım bir hata, başlangıçta dahil etme yollarını farklı bir dil için yapılandırmış olmamdır. CDT ve Cygwin gnu C ++ ile çalışıyorum. Bu nedenle, GNU C ++ dili altında sembolleri ve yolları yapılandırmalısınız.görüntü açıklamasını buraya girin


0

Ayrıca set ${COMMAND}için gccLinux üzerinde

Altında:

  • Proje
  • Özellikleri
  • C / C ++ Genel
  • Önişlemci Yolları, Makroları vb. İçerir.
  • Sağlayıcılar
  • CDT GCC Yerleşik Derleyici Ayarları
  • Derleyici özelliklerini alma komutu

Değiştirin:

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

ile:

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

Bunu yapmazsanız Eclipse standart çıkışı şunları gösterir:

Unable to find full path for "-E"

ve gösterilen günlükler ${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

çünkü ${COMMAND} ${FLAGS}boştur ve bu yüzden Eclipse -Esonraki geleni yürütmeye çalışır .

Ayarlarda COMMANDve FLAGSdeğişkenlerini doğru bir şekilde tanımlayıp tanımlayamayacağımızı merak ediyorum , ancak onları değişkenler olarak eklemeye çalıştım ve işe yaramadı.

Sorunun C ++ versiyonu: Eclipse CDT'de bir C ++ dosyasında "Çözülmemiş dahil etme: <iostream>" nasıl çözülür?

Eclipse 2020-03 (4.15.0), Ubuntu 19.10 ve mevcut kaynaklarla bu minimal Makefile projesinde test edilmiştir .


0

Komut satırından derlenip derlenmediğini kontrol ediyor musunuz? Benim için Linux'ta apt install libc-dev yardımcı oluyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.