visual c ++: #include diğer projelerdeki dosyaları aynı çözümde


113

Visual C ++ kullanan bir oyun üzerinde çalışıyorum. Ayrı projelerde bazı bileşenlerim var ve proje bağımlılıklarını belirledim. # Farklı bir projeden bir başlık dosyasını nasıl dahil ederim? Bir projedeki sınıfları diğerinde nasıl kullanacağım hakkında hiçbir fikrim yok.

Yanıtlar:


200

Derleyici ayarları

Başlık dosyasını başka bir projeden #include etmek istediğiniz projede, başlık dosyasının yolunu proje yapılandırmasındaki Ek Dahil Etme Dizinleri bölümüne eklemeniz gerekir .

Proje yapılandırmasına erişmek için:

  1. Projeye sağ tıklayın ve Özellikler'i seçin.
  2. Konfigürasyon Özellikleri-> C / C ++ -> Genel'i seçin.
  3. Ek Dizinleri Dahil Et altındaki yolu ayarlayın.

Nasıl dahil edilir

To dosyasının eklenmesinin , sadece kodunda aşağıdakileri yazın:

#include "filename.h"

Dizini Ek Dahil Etme Dizinlerine zaten eklediğiniz için, burada yolu belirtmeniz gerekmediğini unutmayın, böylece Visual Studio onu nerede arayacağını bilir.

Proje ayarlarında her başlık dosyası konumunu eklemek istemiyorsanız, yalnızca bir noktaya kadar bir dizin ekleyebilir ve ardından o noktaya göre #include yapabilirsiniz:

// In project settings
Additional Include Directories    ..\..\libroot

// In code
#include "lib1/lib1.h"    // path is relative to libroot
#include "lib2/lib2.h"    // path is relative to libroot

Bağlayıcı ayarı

Statik kitaplıklar (yani .lib dosyası) kullanıyorsanız, bağlantı sırasında semboller birbirine bağlanabilmesi için kitaplığı bağlayıcı girişine de eklemeniz gerekir (aksi takdirde çözülmemiş bir simge alırsınız):

  1. Projeye sağ tıklayın ve Özellikler'i seçin.
  2. Yapılandırma Özellikleri-> Bağlayıcı-> Giriş'i seçin
  3. Ek Bağımlılıklar altındaki kitaplığa girin.

6
SO'da bir sabah bu konudaki cevapları okuduktan sonra, karşıma çıkan en açık ve en kapsamlı şekilde sizinkini söyleyebilir miyim? Aferin ve teşekkürler!
David Hall

9
İsimsiz bir kullanıcıdan, "Kitaplık yolunu eklediğinizde, yolda boşluklar varsa, bunları tırnak içinde girdiğinizden emin olun" şeklinde bir öneri geldi. Birine yardımı olacaksa, yorum olarak eklemek.
iDev

2
Statik bir kitaplık eklemenin ek bir yolu, çözümün "proje bağımlılıkları" içinde, projeyi bağlanılacak statik kitaplığa bağımlı olacak şekilde yapılandırmaktır. Projelerimden birinin neden doğru şekilde bağlandığını anlamam yaşlarımı aldı. ve diğeri değildi - nedeni buydu.
Stuart Ahşap

3
Diğer projenin kaynak dosya diziniyle birlikte "Ek Dahil Etme Dizinleri" kullanmanın korkunç bir fikir olabileceğini belirtmek isterim. Diğer proje aynı ada sahip dosyalara sahip olabilir (büyük olasılıkla, her biri için önceden derlenmiş başlıkları kullanıyorsanız). Kişisel olarak, proje kaynak dosyalarının üst klasörünü eklemeyi tercih ediyorum, böylece en azından kendinizi belirtebilirsiniz, örn #include "proj2\include.h". Çözüm başına birden fazla projeye sahip olmak, çok farklı kullanıldıkları için NET dillerine yöneliktir. Yine de C ++ projeleri için bunun üstesinden gelmenin harika bir yolunu bulmak.
Deji

18
Bu biraz kalitesiz. VS pek çok şeyi otomatik olarak yapabilir. Yolu sert kodlamaya kıyasla daha iyi bir çözüm olmadığına inanmak zor - proje bağımlılığı ayarı veya benzeri güzel olabilir.
Cookie

4

#includeprojelerle hiçbir ilgisi yoktur - sadece önişlemciye "başlık dosyasının içeriğini buraya koy" der. Eğer ona doğru konuma işaret eden bir yol verirseniz (../your_file.h gibi göreli bir yol olabilir), doğru bir şekilde dahil edilecektir.

Bununla birlikte, bu tür projelerin düzgün bir şekilde bağlanması için kütüphaneler (statik / dinamik kütüphaneler) hakkında bilgi edinmeniz gerekecektir - ama bu başka bir soru.


3

Her iki proje de aynı çözüm altında olduğundan, içerme dosyaları ve bağlayıcı için https://docs.microsoft.com/en-us/cpp/build/adding-references-in-visual-cpp- adresinde açıklandığı gibi daha basit bir yol vardır. projeler? görünümü = vs-2019 :

  1. Dahil etme, göreceli bir yolda yazılabilir (Örn. #include "../libProject/libHeader.h").
  2. Bağlayıcı için "Referanslar" a sağ tıklayın, Referans Ekle'ye tıklayın ve diğer projeyi seçin.

Güzel ve basit, ancak çok kötü bir başlık eklediğiniz her yerde göreceli yol gereklidir.
yoyo

2

Derleyicinin başlık dosyalarını bulmaya çalışırken oraya bakması için proje özelliklerinde başlıkların yolunu ayarlamanız gerekir. Tam konumu hatırlayamıyorum, ancak Proje özelliklerine bakın ve görmelisiniz.


Konum, Özellikler> C / C ++> Genel> Ek Dizinleri Dahil Et altında olabilir.
Mustafa Kemal

0

Mutlak veya göreceli olsunlar, #include direktifindeki tam yol referanslarından kaçınmaya çalışın. Bunun yerine, diğer projenin içerme klasörünün konumunu proje ayarlarınıza ekleyin. Gerektiğinde yol referanslarında yalnızca alt klasörler kullanın. Bu şekilde, kodunuzu güncellemenize gerek kalmadan nesneleri hareket ettirmek daha kolaydır.


0

@ Benav'ın cevabını genişleterek, tercih ettiğim yaklaşım şudur:

  1. Çözüm dizinini içerme yollarınıza ekleyin:
    • Çözüm Gezgini'nde projenize sağ tıklayın
    • Özellikler'i seçin
    • açılır menülerden Tüm Yapılandırmaları ve Tüm Platformları seçin
    • C / C ++> Genel'i seçin
    • eklemek $(SolutionDir)Ek için Dizinler Dahil
  2. Kullanmak istediğiniz her projeye referans ekleyin:
    • Çözüm Gezgini'nde projenizin Referanslarına sağ tıklayın
    • Referans Ekle'yi seçin ...
    • başvurmak istediğiniz proje (ler) i seçin

Artık referans projelerinizden aşağıdaki gibi başlıkları ekleyebilirsiniz:

#include "OtherProject/Header.h"

Notlar:

  • Bu, çözüm dosyanızın projelerinizin her birinden bir klasör yukarıda depolandığını varsayar; bu, Visual Studio ile projeler oluştururken varsayılan organizasyondur.
  • Artık çözüm klasörüne göre bir yoldan herhangi bir dosya ekleyebilirsiniz, bu arzu edilmeyebilir, ancak yaklaşımın basitliği için bunda sorun yok.
  • Adım 2, #includes için gerekli değildir , ancak muhtemelen isteyeceğiniz doğru derleme bağımlılıklarını ayarlar.
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.