Visual Studio Express 2005 ile nasıl tamamen statik olarak bağlantılı bir .exe oluşturabilirim?


109

Şu anda tercih ettiğim C ++ ortamı, ücretsiz ve büyük ölçüde mükemmel Microsoft Visual Studio 2005 Express sürümüdür. Zaman zaman diğer insanlara hoş sonuçlar veren .exe dosyaları gönderdim. Ancak son zamanlarda, hoş sonuçların istediğimden daha fazla şansa dayandığını rahatsız edici bir keşif yaptım. Bu programlardan birini eski (2001 yapımı, titizlikle güncellenmemiş) bir XP kutusunda çalıştırmaya çalışmak bana kötü bir "Sistem x.exe'yi çalıştıramıyor" (veya benzeri) mesajından başka bir şey vermedi.

Bazı googling, bu araç setiyle, statik bağlantının belirtilmesinin bile aslında fazladan .dll dosyalarına (msvcm80.dll vb.) Bağlı olan basit bir hello-world.exe ile sonuçlandığını ortaya çıkardı. İnanılmaz derecede ayrıntılı bir sürüm şeması sistemi (bildirim dosyaları var mı?) Bu durumda .exe'nin tam olarak doğru .dll sürümleri olmadan çalışmasına izin vermez. Bunları istemiyorum veya buna ihtiyacım yok, sadece en düşük ortak payda Win32 işlemlerinden başka hiçbir şey yapmayan ve herhangi bir eski win32 işletim sisteminde çalışan eski moda, kendi kendine yeten bir .exe istiyorum.

Mevcut araç setimle yapmak istediğimi yapmanın mümkün olup olmadığını bilen var mı?

Teşekkür ederim.

Yanıtlar:


127

C çalıştırma zamanı için proje ayarlarına gidin, C / C ++ ve ardından 'Kod Oluşturma'yı seçin. 'Çalışma zamanı kitaplığı' ayarını 'çok iş parçacıklı dll' yerine 'çok iş parçacıklı' olarak değiştirin.

Başka bir kitaplık kullanıyorsanız, bağlayıcıya dinamik olarak bağlantılı CRT'yi açıkça görmezden gelmesini söylemeniz gerekebilir.


"Başka bir kitaplık kullanıyorsanız, bağlayıcıya dinamik olarak bağlantılı CRT'yi açıkça görmezden gelmesini söylemeniz gerekebilir." Son zamanlarda bu sorunla karşılaştım. Bir wxWidgets uygulaması oluşturuyordum, wxWidgets kitaplıklarını aynı kod oluşturma değişikliğiyle yeniden oluşturmam gerektiğini fark ettim
Bill Forster

6
Adam 300 karakter çok değil. Yukarıdaki yorumun net olmaması durumunda, sorun hem .cpp dosyalarınız hem de herhangi bir kitaplık .cpp dosyasında 'çok iş parçacıklı dll' yerine 'çok iş parçacıklı' olması gerektiğidir, aksi takdirde bağlantı hataları alabilirsiniz.
Bill Forster

Bu, yığın yönetimi ile ilgili muhtemelen hiçbir şey yapmak istemediğiniz sayısız sorunu ortaya çıkarır.
Edward Strange

CRT kitaplıkları için VS, / MD & / MT seçeneklerini sağlar. Peki ya diğer kitaplıkları statik olarak bağlamaya ne dersiniz - örneğin libX.lib (benim kitaplığım veya üçüncü taraf kitaplığım olabilir)?
Kiran MN

4
Anlıyorum error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. Yapının türünü değiştirecek başka bir yer var mı? @ BillForster gibi wxWigets uygulaması oluşturuyorum. Peki wxWidgets'ı yeniden oluşturmam gerekecek mi? Bunu nasıl yaparım?
Tomáš Zato - Monica'yı eski durumuna getir

19

Visual Studio 2010'daki deneyimim, DLL'lere gerek kalmaması için gerekli iki değişikliğin olmasıdır. Proje özelliği sayfasından (Çözüm Gezgini penceresinde proje adına sağ tıklayın):

  1. Yapılandırma Özellikleri -> Genel altında, "MFC Kullanımı" alanını "Statik Kitaplıkta MFC Kullan" olarak değiştirin.

  2. Yapılandırma Özellikleri -> C / C ++ -> Kod Oluşturma altında, "Çalışma Zamanı Kitaplığı" alanını "Çok İş Parçacıklı (/ MT)" olarak değiştirin

Her ikisine de neden ihtiyaç duyulduğundan emin değilim. Bunu glut32.dll bağımlılığını ortadan kaldırmak için kullandım.

Daha sonra eklendi: Konfigürasyonlarda bu değişiklikleri yaparken, bunları "Tüm Konfigürasyonlar" olarak yapmalısınız --- bunu Özellikler penceresinin üstünden seçebilirsiniz. Değişikliği yalnızca Hata Ayıklama yapılandırmasında yaparsanız, Sürüm yapılandırması için geçerli olmaz ve bunun tersi de geçerlidir.


1
Bu, küçük bir eklemeyle Visual Studio 2013'te çalışıyor gibi görünüyor: Yapılandırma Özellikleri -> Genel -> Karakter Kümesini "Unicode Karakter Kümesini Kullan" olarak değiştirmem gerekti.
gnovice

4

Aynı bağımlılık sorununu yaşadım ve ayrıca VS 8.0 DLL'lerini (yalnızca yayınlayın! Hata ayıklamayın! --- ve programınızın da yayınlanması gerekir) uygun ada sahip bir klasöre dahil edebileceğinizi biliyorum. .exe ile ana klasör:

Nasıl yapılır: XCopy (MSDN) kullanarak dağıtma

Ayrıca, aynı statik bağlantılı .exe'de C ++ ve C koduna sahip olmanız gerektiğinde, yalnızca doğru libXXX.lib'i yok sayarak ve ardından dinamik olarak bağlanarak (DLL'ler) çözülebilecek bağlayıcı çakışmaları alacağınız için, işlerin ters gitmesinin garantili olduğunu unutmayın. .

Son olarak, farklı bir araç setiyle (VC ++ 6.0) işler "sadece çalışır", çünkü Windows 2000 ve üzeri doğru DLL'lere sahip.


1

Jared'in yanıtıyla ilgili olarak, Windows 2000 veya daha iyisine sahip olmak, sorunu mutlaka çözmeyecektir. Rob'un yanıtı işe yarıyor, ancak bu düzeltmenin güvenlik sorunları ortaya çıkarması mümkündür, çünkü Windows güncellemeleri bu şekilde oluşturulan uygulamaları yamayamayacaktır.

Başka bir gönderide, Nick Guerrera, Visual C ++ Runtime Yeniden Dağıtılabilir'i uygulamalarınızla birlikte paketlemeyi öneriyor, bu hızla yüklenir ve Visual Studio'dan bağımsızdır.


2
Yeniden dağıtılabilir paketi paketlemek tercih edilen çözüm gibi görünse de, yeniden dağıtılabilir yükleyiciyi çalıştırmak için yönetici ayrıcalıklarına ihtiyacınız var. Yönetici olmayan kullanıcılarınız varsa bu geçerli bir seçenek değildir.
Kevin Condon
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.