Visual Studio 2005 ile Google C ++ Test Çerçevesi (gtest) nasıl kurulur


Yanıtlar:


44

Arlaharen'in söylediği şey temelde doğruydu, ancak bağlayıcı hatalarınızı açıklayan kısmı dışarıda bıraktı. Öncelikle, uygulamanızı bir çalışma zamanı kitaplığı olarak CRT olmadan oluşturmanız gerekir . Uygulamanızın dağıtımını gerçekten basitleştirdiği için bunu her zaman yapmalısınız. Bunu yapmazsanız, tüm kullanıcılarınızın Visual C ++ Çalışma Zamanı Kitaplığı'nın yüklü olması gerekir ve sistemlerinde gizemli DLL'nin eksikliğinden şikayet etmeyenler ... bağlanmanın maliyeti olan fazladan birkaç yüz kilobayt için CRT'yi statik olarak, daha sonra destek olarak kendinizi bir çok baş ağrısından kurtarırsınız (bu konuda bana güvenin - bunu zor yoldan öğrendim!).

Her neyse, bunu yapmak için, hedefin özelliklerine -> C / C ++ -> Kod Oluşturma -> Çalışma Zamanı Kitaplığı'na gidersiniz ve Yayın yapınız için "Çok İş Parçacıklı" ve "Çok İş Parçacıklı Hata Ayıklama" olarak ayarlanması gerekir. Hata ayıklama yapınız.

Gtest kitaplığı da aynı şekilde oluşturulduğundan, onun doğru sürümüne bağladığınızdan emin olmanız gerekir , aksi takdirde bağlayıcı, çalışma zamanı kitaplığının başka bir kopyasını çeker, gördüğünüz hata budur (btw, this MFC kullanıyorsanız veya kullanmıyorsanız bir fark yaratmamalıdır). Hem Hata Ayıklama hem de Yayın modu olarak gtest oluşturmanız ve her iki kopyayı da saklamanız gerekir. Daha sonra Sürüm yapınızda gtest.lib / gtest_main.lib ve Hata Ayıklama yapınızda gtestd.lib / gtest_maind.lib ile bağlantı kurarsınız.

Ayrıca, uygulamanızın gtest başlık dosyalarının depolandığı dizine işaret ettiğinden emin olmanız gerekir (özellikler -> C / C ++ -> Genel -> Ek Dahil Etme Dizinlerinde), ancak bağlayıcı hatasına sahipseniz, varsayıyorum Bu bölümü zaten doğru bir şekilde almayı başardınız, yoksa ilk önce ilgilenmeniz gereken çok daha fazla derleyici hatası olurdu.


Bütün günümü geçirerek bunu "zor yoldan" öğrendim. Sonunda ikisini de aynı şekilde oluşturduktan sonra çalıştırdım. Cevabınız için teşekkürler ama geç oldu. : / Ve BTW, CRT öneriniz yanlış, ancak bunu tartışmak için yeterli alanım yok. Bkz tinyurl.com/dj5k7k
knaser

Eğer bunu "zor yoldan" öğrendiyseniz, CRT çalışma zamanı dll'lerinin "yeniden dağıtılabilir" olarak adlandırıldığını unutabilirsiniz ... bu nedenle, onları yeniden dağıtmanız gerektiği açıktır ... ya kendi yükleyicinize redist yükleyiciyi dahil ederek veya kendi kurulum klasörünüzdeki gerekli
dll'leri çıkararak

1
Statik olarak CRT cevap vermem application / güvenlik düzeltmelerini istismar anlamına bağlama
paulm

106

(Bu talimatlar, Test çerçevesinin Hata Ayıklama yapılandırması için çalışmasını sağlar. Aynı işlemi Sürüm yapılandırmasına uygulamak oldukça önemsiz olmalıdır.)

Google C ++ Test Çerçevesini Edinin

  1. En son gtest çerçevesini indirin
  2. Unzip C:\gtest

Çerçeve Kitaplıklarını Oluşturun

  1. C:\gtest\msvc\gtest.slnVisual Studio'da açın
  2. Yapılandırmayı "Hata Ayıkla" olarak ayarlayın
  3. Çözüm Oluşturun

Test Projenizi Oluşturun ve Yapılandırın

  1. Yeni bir çözüm oluşturun ve Visual C ++> Win32> Win32 Konsol Uygulaması şablonunu seçin
  2. Yeni oluşturulan projeye sağ tıklayın ve Özellikler'i seçin
  3. Yapılandırmayı Hata Ayıkla Değiştirin.
  4. Yapılandırma Özellikleri> C / C ++> Genel> Ek İçerme Dizinleri: Ekle C:\gtest\include
  5. Yapılandırma Özellikleri> C / C ++> Kod Oluşturma> Çalışma Zamanı Kitaplığı: Kodunuz bir çalışma zamanı DLL'sine bağlanıyorsa, Çok İş parçacıklı Hata Ayıklama DLL (/ MDd) öğesini seçin. Değilse, Çok İş Parçacıklı Hata Ayıklama (/ MTd) öğesini seçin.
  6. Yapılandırma Özellikleri> Bağlayıcı> Genel> Ek Kitaplık Dizinleri: gtestd.lib dosyasının konumuna bağlı olarak C:\gtest\msvc\gtest\Debugveya C:\gtest\msvc\gtest-md\Debugekleyin
  7. Yapılandırma Özellikleri> Bağlayıcı> Giriş> Ek Bağımlılıklar: Ekle gtestd.lib

Her Şeyin Çalıştığını Doğrulamak

  1. main()Fonksiyonu içeren Test Projenizde cpp'yi açın .
  2. Aşağıdaki kodu yapıştırın:

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
  3. Hata Ayıkla> Hata Ayıklamayı Başlat

Her şey işe yaradıysa, konsol penceresinin açıldığını görmeli ve size birim test sonuçlarını göstermelisiniz.


9
bu harika bir rehberdi! Topu yuvarlamayı başardım, ancak oraya bir not daha ekleyecektim: test projesi ve gtest kitaplığı aynı Kod Oluşturma seçeneğiyle oluşturulmalıdır, her ikisi de / MDd'dir veya her ikisi de / MTd'dir, aksi takdirde olacak bir grup bağlantı hatası olabilir.
Kiril

1
Not: Bu benzer uygulamayı Microsoft Visual Studio .Net 2003 ile gerçekleştirmeye çalışan her kim olursa olsun, Google Test Framework kitaplıkları Çalışma Zamanı Kitaplığı'nı Hata Ayıklama modu için ' Tek iş parçacıklı Hata Ayıklama ' ve Yayın Modu için ' Tek iş parçacıklı ' olarak varsayılan olarak ayarlar. Denediğim kadarıyla, onu Kod Oluşturma'dan değiştirme seçeneği mevcut değil. Bu nedenle, lütfen projenizde çalışma zamanı kitaplığınız olarak Tek iş parçacıklı seçeneğini seçtiğinizden emin olun. Bunun dışında, bu basit ve kısa öğretici mükemmel çalışıyor!
Neophile

Bu, işe yarayan ve kötü bir uygulamayı teşvik etmeyen beş öğreticiden ilkidir. Bu, test projesini orijinal projeye bağlamanın önemli yönünü kapsamışsa çok sevinirim ... 30'dan fazla site sonra, çalışan bir cevap bulamadım. Bunun için 3 gün geçirdim.
kişi27

"Proje Özellikleri> Yapılandırma Özellikleri> C / C ++> Çalışma Zamanı Kitaplığı"
ndaki


5

Gtest'i oluşturduktan sonra, bunu yaptım:

  1. Ortak Özellikler-> Bağlayıcı-> Genel-> Ek Kitaplık Dizinlerine \ mypath \ gtest-1.0.1 \ Debug (veya Yayın) ekleyin
  2. Gtest.lib ve gtest_main.lib'i Ortak Özellikler-> Bağlayıcı-> Giriş-> Ek Bağımlılıklar'a ekleyin

Bundan sonra testlerimi uygun şekilde TEST veya TEST_F kullanarak yazıyorum ve bunları ana işlevimle birlikte derliyorum:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

5
Çok sayıda bağlayıcı hatası alıyorum: gtest.lib'de zaten tanımlanmış ... ör.: 1> LIBCMT.lib (tidtable.obj): hata LNK2005: __encode_pointer msvcrt.lib'de (MSVCR80.dll) zaten tanımlanmış Oh, btw, I MFC kodu için testler yazmaya çalışıyorum.
knaser

Afedersiniz. Orada sana yardım edebileceğimi sanmıyorum. Bazı nedenlerden dolayı bu bağlantı hatalarını alamıyorum. Gtest ile sadece bir merhaba dünya testi oluşturmayı denediniz mi?
Arlaharen

gtest_main.libvarsayılan mainişlevi içerir , bu nedenle mainaçıkça kendi işlevinizi yazdıysanız, muhtemelen eklemek istemezsiniz .
Groo

5

Testler için kendi main () 'inizi yazmak istemiyorsanız, gtest_main.lib'de tanımlanan main () işlevini kullanabilirsiniz, ancak daha sonra VS2012'de "Giriş noktası tanımlanmalıdır" bağlayıcı hataları alırsınız. Test projenizde ProjectProperties-> Linker-> System-> SubSystem'i "Konsol" olarak ayarlayın çünkü bu, VS2012'yi "main ()" adında bir giriş noktası aramaya zorlar ve onu gtest_main.lib'de bulacaktır (bağlantı verdiyseniz düzgün bir şekilde).


2

Microsoft Visual Studio'da, yanlış yapılandırılmış çalışma zamanı kitaplık türü bağlantı hatalarına neden olur.

VS 2005 (ve 2008), varsayılan olarak Multithreaded DLL veya Multithreaded Debug DLL kullanır. Ancak Google Test kitaplığı, varsayılan olarak Çok iş parçacıklı veya Çok iş parçacıklı hata ayıklama çalışma zamanını kullanır.

Bu nedenle, google test kitaplığı için uygun çalışma zamanı kitaplığı türünü seçin. (Yapılandırma özelliklerinde -> Kod Oluşturma -> Çalışma Zamanı Kitaplığı).


uygun çalışma zamanı nedir? (MD veya diğer)
Ramadheer Singh
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.