2011-11-11 28 views
5

Visual C++ 2008 Express'te VC++ 6 çalışma alanını dönüştürdükten sonra bir uygulama yapıyorum. kendisi başarıyla gider Build ama ben gerçek bir sorun şöyle oluşturulan Bildirimlerin geçerli:C çalışma zamanı (CRT) Kitaplıkları nasıl dağıtılır

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level='asInvoker' uiAccess='false' /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

Benim Soru geçerli:

nasıl sadece BİR sürümü, tercihen 9,0 listelemek için tezahür kısıtlayabilirsiniz. 21022,8. Uygulamamdaki gerekli C-Run zaman bağımlılıklarını paketleyebilmem için mi?

Ben bu soruna olası temel nedeni 9.0.21022.8 kullanır ve benim VC 2008 9.0.30729.1 kullanıyor olabilir Ekspres ++ bazı kütüphaneye bağımlılık olduğunu biliyoruz. Bu yüzden her ikisi de bağımlılık olarak listeleniyor.

Not:

ben uygulama klasörü içinde CRT DLL dosyaları ve Microsoft.VCXX.CRT.manifest dosya kopyalanırken bahsediyor http://www.codeproject.com/Tips/211756/How-to-Distribute-C-run-time-CRT-Libraries-with-Yo?display=Print yaklaşımı b) takip ediyorum.

+0

Bunu düzeltmeniz gerekiyor. Evet, tüm lib'leri aynı derleyici ayarlarıyla yeniden oluşturun. –

+0

Hans'ın yorumuna ek olarak, okumaya değer [this] (http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/) Kodunuzun bağlandığı kütüphanenin sürümünü kontrol etmekle ilgili birazcık. – tinman

+0

Teşekkürler @tinman, gönderdiğim bağlantı sorunumu çözmede yardımcı oldu. – amit

cevap

9

Visual Studio 2008 için varsayılan sürüm 9.0.21022.8 sürümüne bağlanmaktır. Bu, Visual Studio'daki güncelleştirmelerin mutlaka uygulamanızı yükseltmesi gerekmediğinden (here açıklandığı gibi) hizmet paketinin veya yüklü olan düzeltmenin sürümünden bağımsız olarak geçerlidir.

Diğer olası sürümlerini güvenlik güncellemesiyle SP1 için Service Pack 1 veya 9.0.30729.6161 için 9.0.30729.1 vardır. Başkaları var. Çünkü varsayılan davranış

, uygulama 9.0.21022.8 kullanıyorsa ve 9.0.30729.1 kullanmak derlenmiştir bir kütüphane olduğu muhtemeldir. Sen şu komut satırını (described here) kullanarak bağlıdır her kütüphanenin hangi sürümünü öğrenebilirsiniz:

Başvurunuz projeye ayarlarınızı önişlemci sembolleri tanımlayabilir size bağlanan çalışma zamanının control the version amacıyla
dumpbin /directives <name>.lib 

varsayılan sürümü (9.0.21022.8 - tanımlayarak vermeyerek) ya bağlama için (proje ayarlarında veya komut satırında olmalıdır) veya yüklü Visual Studio gibi aynı sürümüne bağlanma:

_BIND_TO_CURRENT_VCLIBS_VERSION=1 

Görünüşe göre e this answer tanımlarını kullanarak bağlamak istediğiniz xact sürümü (belki de tüm bunları yazmadan önce bunu bulmalıyım :).

bunu 9.0.30729.1 bağlanır ve bağımlı kütüphane 9.0.21022.8 için bağlayıcıdır sizin uygulamadır bulursanız

o zaman basitçe önişlemci tanımını kaldırmak gerekir.

Diğer zorluk, Visual Studio'yu yükselttiğinizde, yeniden dağıtılabilen klasörünüzdeki çalışma zamanı birleştirme modülleri de bu sürümlere yükseltilir. Dolayısıyla, bu birleştirme modüllerini kullanan bir kurulum projeniz varsa ve varsayılan sürüme bağlamaya çalışıyorsanız, çalışma zamanlarının yeni sürümlerini yüklemiş olursunuz. Çalışma zamanı sürümünün çözümlenmesi, çalışma zamanı ilkesi birleştirme modüllerini de dağıttığınız zaman, bir sorun olmayacaktır, çünkü kitaplık yükleyici çalışma zamanında çalışma zamanınızın politikasına bakar ve varsayılana bağlansanız bile en yeni sürümü otomatik olarak yükler. sürümü. Özel meclislerde bile yükleyici will first look in the WinSxS folder, eğer politikalar varsa, en yeni sürüme bağlanacaksınız.Dolayısıyla, manifestinizde bulunan karma sürüm numaralarınız hem en yeni sürüme yönlendirilecek.

Bazen bu istenmez ve bunu yalnızca belirttiğiniz bildirimdeki sürümü yüklemek için zorlayabilir ve bu, this similar SO question numaralı yanıtın içinde açıklanmıştır.

+0

+ Bounty: Harika. –

İlgili konular