2009-07-14 26 views
13

C++ uygulamasında yeniyim ve tamamen almadığım bir şey var. C# 'da, eğer log4net harici bir kütüphane kullanmak istersem, log4net DLL' ye bir referans ekledim ve üyeleri bana otomatik olarak (ve IntelliSense'de) kullanılabilir. Bunu yönetilmeyen C++’da nasıl yaparım?C++ 'da başvuru ekleme "

cevap

23

Sıklıkla, kütüphane 1) bir ek dosya (.h) ve 2) .dll dosyasına ek olarak bir .lib dosyası ile birlikte gelir.

Kitaplıktaki tür ve işlev bildirimlerine erişebilmeniz için, üstbilgi dosyası kodunuzda # include'ed öğesidir.

.lib uygulamanıza bağlanır (proje özellikleri -> bağlayıcı -> giriş, ek bağımlılıklar).

.lib dosyası genellikle dll ve forward işlev çağrılarını otomatik olarak yükleyen basit taslaklar içerir.

.lib dosyanız yoksa, DLL'yi dinamik olarak yüklemek için LoadLibrary işlevini kullanmanız gerekir.

+0

Cevabımdan daha kapsamlı. Ayrıca LoadLibrary kullanıyorsanız, işlevleri isme göre isimlendiremezsiniz. Geç bağlama yapman gerekiyor. –

+1

Tekrar görmediğimi görüyorum. LoadLibrary, gerçek bir işaretçi olan GetProcAddress'e geçirebileceğiniz bir tanıtıcı döndürür. Boşaltmak için FreeLibrary'ı da seçebilirsiniz. (İleri gittim ve orijinal cevabımı sildim.) –

+0

@Steven: Doğru, LoadLibrary'i kullanması gerekiyorsa, ona (çok) cesur detaylarda boğulmadan bir başlangıç ​​noktası vermeliydim. – jalf

0

Yapmanız gereken ilk şey, kütüphanede kullanılabilen işlevleri açıklayan üstbilgi dosyasının bulunması.

kütüphane için gerçek kod biri 2 yerlerde olacaktır:

Statik kitaplığı (.lib)
  • bir dll (.dll)
  • şekline bağlı

    1. kütüphane kodu size (.lib dosyaları veya bir .dll dosyası olarak) verilirse, aşağıdakilerden birine sahip olursunuz:

      • #pragma comment (lib, "libraryname.lib") onun bir
      • LoadLibrary .Lib eğer onun bir

    2. Bazen bir paket size bağlamanız gereken bir .lib dosyasından ve bir .dll dosyası İKİ ile gelir .dll. Bu durumda LoadLibrary'i aramanıza gerek yoktur, sadece #pragma comment (lib, "libaryfile.lib") gerekir. Çünkü bu durumda .lib sizi .dll'ye bağlar.

      Çok önemli bir ayrıntı, uygulamanızın bulabileceği DLL dosyasını yerleştirmektir. Charles Petzold diyor ki:

      Windows gereken bir programı çalıştırmadan önce bir DLL modülü yüklemeye ihtiyaç duyduğunda, kütüphane dosyası .EXE programını, geçerli dizini, Windows sistem dizinini içeren dizinde saklanmalıdır. Windows dizini veya MS-DOS ortamında PATH dizesi aracılığıyla erişilebilen bir dizin. (Dizinleri bu sırayla aranır.) Programming windows, 5th ed MSDN

      Ben size bağlıyoruz kütüphaneler Ne kadar görünür olmadığından bağlamak için proje özellikleri menüsünü kullanarak önermiyoruz.

      See also

    +0

    Bu soruya cevap vermiyor. –

    +0

    Şimdi bu soruya cevap veriyor, ancak doğru değil. Jalf'ın işaret ettiği gibi, normalde import lib ile bağlantı kurarsınız (pragma'yı kullanarak veya lib.exe'nin içinde bulunduğu komut satırına ekleyerek). LoadLibrary kullanımı geç bağlayıcı alternatiftir. –

    4

    C++ senin sandığın anlamda kütüphaneler yoktur. Bu dosya, #include numaralı başlık dosyalarına sahiptir ve derleyicinin derlenmiş kodu içeren, birlikte çalıştığı kütüphaneler adı verilen şeylere sahiptir. Kütüphane ayarlarını (.LIB dosyaları) linker ayarlarına eklemeniz gerekir.

    Windows'ta bir DLL kullanıyorsanız, ideal olarak DLL için Import Library (Kütüphane Alma Kütüphanesi) adı verilen bir .LIB dosyasına sahip olmanız gerekir ve bu .LIB dosyasını linker ayarlarınıza eklersiniz.

    9

    Temel kavram şu şekildedir: 2 tür kitaplık vardır: statik & dinamik. Aralarındaki fark, bağlantı oluşturma adımı sırasında statik kitaplıkların derlenmiş kodu yürütülebilir dosyanıza (veya dll'ye) gömmesidir; dinamik lib'ler sadece fonksiyonlara işaretçileri yerleştirir ve program yüklendiğinde bazı dll'nin yüklenmesi gereken bir talimat. Bu linker tarafından sizin için gerçekleştirilmiştir.

    Şimdi bu ikisinden hangisini kullanacağınıza karar verebilirsiniz. DLL'lerin birçok avantajı ve dezavantajı vardır. Büyük bir uygulama geliştiriyorsanız, statik lib'leri yerine gecikme yüklemesiyle DLL'leri kullanmayı düşünmeye değer olabilir. Bazı libs'ler size DLL olarak kolayca teslim edilir ve başka seçeneğiniz yoktur. Her neyse yeni başlayanlar için en kolay yol statik kütüphaneleri kullanmak olacaktır. Bu, dağıtımınızı ve testinizi çok daha kolaylaştıracaktır, çünkü DLL ile uğraşırken bunların çalışma zamanında (hata ayıklayıcısını kullanırken bile) bulunduğundan emin olmanız gerekir, bu da her şeyi bir dizinde kopyalamayı veya yol değişkenlerini ele almayı içerir.

    Genellikle bir DLL sağlayıcısı (eğer kitaplıkla ilgilenmeniz isteniyorsa) size bir üst dosya (lar) ve istenen DLL'ye çağrıları içeren bir .lib sunar. Bazı satıcılar (örneğin, destek) yalnızca başlık dosyasını eklemenizi gerektirir ve lib otomatik olarak sizin çalıştırıcınıza bağlıdır (derleyici özel pragma yönergesi ile elde edilebilir). Eğer durum böyle değilse, C++ projesinin proje ayarlarına (proje özellikleri/Yapılandırma Özellikleri/Bağlayıcı/Giriş) girmeli ve "Ek Bağımlılıklar" satırına lib dosya adını girmelisiniz. iced.lib iceutild.lib. Ayrıca tam yol isimlerini buraya da yazabilirsiniz. Her iki yapılandırma için lib dosya adlarını girmeniz gerektiğini unutmayın (Debug, Release). Bu, statik kütüphaneler ve Dll ile eşit olarak yaptığınız prosedürdür. DLL'nin DLL-lib'inin uygulama dizininde ya da yol dizinlerinden birinde olmasını gerektiren tek fark.

    Bu adımdan sonra, uyumsuz kitaplıkları bağlamaya çalıştığınızda derleyici hataları alabilirsiniz. Pek çok nedeni var, neden uyumsuz olabilirler. Fakat önce lib'i bu şekilde bağlamaya çalışın ve işe yarayıp yaramadığını görün. Değilse, hatalarınızı tekrar gönderin;)

    Dosya (lar) da dahil olmak üzere, içeriklerini içermek için kullanılan dosyaları dahil edin. lib'den. Sadece ekleyin ve derleyici sembollerin başka bir derlenmiş (derlenmiş) derleme biriminden (derlenmiş cpp-file => nesne dosyası) veya .lib'den gelmesi gerektiğini bilir. Gerekli semboller bulunmazsa, sizi arar ve size bildirir.

    Good Luck,
    Ovanes

    Not; Bu başlangıçta zor olabilir, ama alıştığınız zaman, bu kolay olacaktır.