2008-09-01 18 views
78

Geçerli tercih edilen C++ ortamım, ücretsiz ve büyük ölçüde mükemmel Microsoft Visual Studio 2005 Express sürümüdür. Zaman zaman .exe dosyalarını hoş insanlarla diğer insanlara gönderdim. Ancak son zamanlarda, memnuniyet verici sonuçların istediğim daha fazla şansa dayandığı konusunda rahatsız edici bir keşif yaptım. Bu programlardan birini çalıştırmaya çalışırken (2001 vintage, titizlikle güncelleştirilmemiş) XP kutusu bana kötü bir "Sistem x.exe dosyasını çalıştıramıyor" (veya benzeri) iletiden başka bir şey vermedi.Visual Studio Express 2005 ile tam olarak statik bağlantılı bir .exe nasıl yapabilirim?

Bazı googling, bu araç seti ile, statik bağlantı belirtmenin bile aslında ekstra .dll dosyalarına (msvcm80.dll vb.) Güvenerek basit bir hello-world.exe içinde sonuçlandığını ortaya çıkardı. Inanılmaz derecede ayrıntılı bir sürüm şema sistemi (manifest dosyaları herkes?) Sonra .exe tam olarak doğru .dll sürümleri olmadan çalışmasına izin vermez. Bu şeyler istemiyorum ya da ihtiyacım yok, sadece eski bir moda kendi kendine yer alan .exe içeren bir şey istiyorum ama en düşük ortak payda Win32 işlemleri ve herhangi bir eski win32 işletim sistemi üzerinde çalışır.

Varolan araç setimle yapmak istediğimi yapıp yapamayacağını bilen var mı?

Teşekkür ederiz.

cevap

95

C-çalışma zamanı için proje ayarlarına gidin, C/C++ ardından 'Kod Üretimi'ni 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 kütüphane kullanıyorsanız, linker'e dinamik olarak bağlantılı CRT'yi açıkça görmezden gelmesi gerektiğini bildirmeniz gerekebilir.

+0

"Başka kütüphane kullanıyorsanız, linker'e dinamik olarak bağlantılı CRT'yi açıkça görmezden gelmeniz gerekebilir." Son zamanlarda bu konuya koştum. Bir wxWidgets uygulaması oluşturuyordum, aynı kod oluşturma modifikasyonu ile wxWidgets lib'lerini yeniden oluşturmam gerektiğini buldum. –

+6

Man 300 karakter çok fazla değil. Yukarıdaki yorumun belirsiz olması durumunda, sorun .cpp dosyalarınızın ve herhangi bir kütüphane .cpp dosyasının 'multithreaded dll' yerine 'multithreaded' olması gerektiğidir. Aksi halde link hataları alabilirsiniz. –

+0

Bu, yığın yönetimiyle ilgili, muhtemelen hiçbir ilgisi olmasını istemediğiniz sayısız sorun ortaya çıkarır. –

4

Aynı bağımlılık sorunu yaşadım ve ayrıca VS 8.0 DLL'lerini (yalnızca hata ayıklama değil! Hata ayıklama! --- ve programınız da yayınlanmak zorunda) bir klasöre ekleyebileceğinizi biliyorum. Adın, .exe ana klasör içinde:

How to: Deploy using XCopy (MSDN)

Ayrıca bağlayıcı alacak çünkü aynı statik olarak bağlı .exe C++ ve C koduna sahip olmaları gerekiyorsa işler ters gitmeye garanti unutmayın Sadece doğru libXXX.lib göz ardı ederek ve sonra dinamik olarak (DLL) bağlayarak çözülebilir çatışmalar.

Son olarak, farklı bir araç kümesiyle (VC++ 6.0) şeyler "sadece çalışır", çünkü Windows 2000 ve üstü doğru DLL'lere sahip.

1

Jared'in cevabı, Windows 2000 veya daha iyi bir sürümü olması sorunu çözmeyi gerektirmeyecektir. Rob'un yanıtı işe yarıyor, ancak Windows güncellemeleri bu şekilde oluşturulan uygulamaları yamalayamayacağı için bu düzeltmenin güvenlik sorunlarını ortaya çıkarması olasıdır.

Başka bir gönderide, Nick Guerrera, Visual C++ Runtime Redistributable'ı, uygulamalarınızı hızlı bir şekilde yükleyen ve Visual Studio'dan bağımsız olarak paketlemeyi önerir.

+2

Yeniden dağıtılabilen paketler tercih edilen çözüm gibi görünmekle birlikte, yeniden dağıtılabilir yükleyiciyi çalıştırmak için yönetici özel gereksinimlerine sahip olmanız gerekir. Yönetici olmayan kullanıcılarınız varsa bu geçerli bir seçenek değildir. –

4

Visual Studio 2010'daki deneyimim, DLL'ye gereksinim duymayacak şekilde iki değişiklik yapılması gerektiğidir. > Genel, içindeki bir statik kitaplığı alanına "Kullanım MFC "MFC Kullanımı" değiştirmek -

Yapılandırma Özellikleri altında
  1. : Proje mülkü sayfasından (sağ Solution Explorer penceresinde proje adını tıklayın) ".

    Yapılandırma Özellikleri Altında
  2. -> C/C++ - her ikisi de gereklidir neden> Kod Üretimi, "Runtime Library" alanı "Çok Dişli (/ MT)"

Emin değilim değiştirmek . Bunu glut32.dll bağımlılığını kaldırmak için kullandım.

+0

Teşekkürler. Hayatımı kurtardı. :) –

İlgili konular