2010-07-02 16 views
7

Ben VS 2008 (1.4-3 ver) basit Boost öğretici :: Konu izlemeye çalışıyorum:boost :: iplik inşa hatası (bağlantılandıramayabiliriz lib && dış çözülmedi)

#include <boost/thread/thread.hpp> 

void Func() 
{ 
    // Do something 
} 

void main() 
{ 
    boost::thread _thrd(&Func); 
    _thrd.join(); 
    .... 
} 

sırasında

Error 1 fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-gd-1_43.lib' CConsole 

Ben #define BOOST_ALL_NO_LIB ekleyerek çözmek zorunda: derleme bu hatayı üretir.

Error 3 fatal error LNK1120: 2 unresolved externals 
C:\xx\Documents\Visual Studio 2008\Projects\CConsole\Debug\CConsole.exe 


Error 1 error LNK2019: unresolved external symbol "public: __thiscall boost::thread::~thread(void)" ([email protected]@@[email protected]) referenced in function _wmain CConsole.obj 


Error 2 error LNK2019: unresolved external symbol "private: void __thiscall boost::thread::start_thread(void)" ([email protected]@[email protected]@AAEXXZ) referenced in function "public: __thiscall boost::thread::thread<void (__cdecl*)(void)>(void (__cdecl*)(void),struct boost::thread::dummy *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) CConsole.obj 

kimse sorunun nasıl çözüleceği biliyor mu

: Ancak, bana başka hata veriyor?

Teşekkürler.

+0

Boost'un tüm parçaları yalnızca başlık değil. Uygun cpp dosyalarını (önerilmez) veya (genellikle daha iyi) projenize bağlayabileceğiniz statik bir kütüphane oluşturmanız gerekir. – stinky472

+0

Merhaba stinky472, Ben lib dosyasını bağladım, ancak dosya isminin bit fark olduğunu fark ettim, bu yüzden dosyayı yeniden adlandırıyorum ve işe yaramış görünüyor. Teşekkürler. – csa

+0

lib'in adı, ne tür bir lib geliştirdiğinize bağlı olarak değişir: statik/dinamik, debug/release, single/multithreading .... Bu ismi değiştiremezsiniz, ancak parametrelere ihtiyacınız olan doğru librayı bjam-oluşturucu. – nabulke

cevap

0

Her ikisi de Boost İş parçacığı kütüphanesini oluşturmalı ve Visual Studio'ya kütüphanenin nerede olduğunu söylemelisiniz. Tüm bunlar Başlangıç ​​belgelerinde (ör. Getting Started on Windows) belgelenmiştir. Spesifik olarak section 5 ve ardından section 6'u okuyun.

PS. Yapılandırma yapılandırmanızın VS'ye sahip olduğunuzla eşleştiğinden emin olmanız gerekir. Başlarken çeşitli yapı seçeneklerini açıklar.

21

"F * cking Manual'ı okuyun" dan daha derin bir yanıt bulabilirim.

Bu tür bir bağlantı hatası, uyumsuz bir Destek kitaplığını bağlamaya çalıştığınız hakkında bir ipucu.

64 bitlik bir kitaplık oluşturduğumu düşünürken yanlışlıkla 32 bitlik bir Boost iş parçacığı oluşturduğumda bunu anladım. --address-model=64 bjam komut satırı parametresi dediğinizde, ince bir hata yaptığınızı anlamak biraz zaman aldı. address-model parametresi, -- önekine sahip olmamalıdır. Ne yazık ki bjam yanlış sözdizimini gördüğünde sizi bilgilendirmez.

Kitaplığınız tarafından sağlanan sembollere ve bağlayıcıların çözülmediğini belirten simgelere karşı kontrol etmek için çöp kutusu programını kullanabilirsiniz. Kütüphane sembollerinin __thiscall ile değil __cdecl ile dekore edildiğini buldum. Bu, mimarlık uyumsuzluğunun iyi bir ipucudur. Microsoft derleyici, 32-bit yapılar için __thiscall işlev çağrısı protokolünü kullanır, ancak 64-bit yapılar için __cdecl kullanır. Evet, Microsoft belgeleri burada biraz zayıf!

Nasıl oluşturulduğunu görmek için bir .lib veya .dll dosyasını denetlemenin en iyi yolu, dumpbin programını kullanmaktır. Örnek:

dumpbin /headers libboost_thread-vc100-mt-gd-1_45.lib | findstr machine 

Kütüphane adını, bağlantı kurduğunuza uyacak şekilde ayarlamanız gerekir. Bu, .lib veya .dll dosyasının x86 (32 bit) veya x64 (64 bit) için hedeflenip hedeflenmediğini size gösterecektir.

+1

Bir "Visual Studio 2005 x64 Win64 Komut İstemi" kullanarak, 64-bit destek kütüphaneleri kullanabiliyordum. Sonra bu tür bağlantı hataları yapmaya devam ettim. Bu cevabı bulmak için çok uğraştı. Teşekkürler! '. \ B2 address-model = 64 stage' – Mark

+0

Bu tür sorunlar, varsayılan olarak tüm libs'ler için aynı dizini kullanan ve mimariye bağlı olarak dosya adını değiştirmediği gerçeğinden kaynaklanır. Bu sayede x86 lib'leri i64 olanlar ile kolayca yazabilirsiniz ve tam tersi. –