Bagaimana cara membuat .exe yang terhubung secara statis dengan Visual Studio Express 2005?

109

Lingkungan C ++ pilihan saya saat ini adalah edisi Microsoft Visual Studio 2005 Express yang gratis dan sangat bagus. Dari waktu ke waktu saya telah mengirimkan file rilis .exe ke orang lain dengan hasil yang memuaskan. Namun baru-baru ini saya membuat penemuan yang mengganggu bahwa hasil yang menyenangkan didasarkan pada lebih banyak keberuntungan yang saya inginkan. Mencoba menjalankan salah satu program ini di kotak XP lama (vintage 2001, tidak diperbarui dengan teliti), tidak memberi saya apa-apa selain pesan buruk "Sistem tidak dapat menjalankan x.exe" (atau serupa).

Beberapa googling mengungkapkan bahwa dengan toolset ini, bahkan menentukan hasil tautan statis dalam hello-world.exe sederhana sebenarnya mengandalkan file .dll tambahan (msvcm80.dll dll.). Sistem skema versi yang sangat rumit (manifeskan file siapa?) Tidak akan membiarkan .exe berjalan tanpa versi .dll yang tepat. Saya tidak ingin atau membutuhkan barang-barang ini, saya hanya ingin .exe berisi diri kuno yang tidak melakukan apa pun kecuali operasi penyebut umum terendah Win32 dan berjalan pada OS win32 lama.

Adakah yang tahu jika mungkin untuk melakukan apa yang ingin saya lakukan dengan perangkat saya yang sudah ada?

Terima kasih.

Bill Forster
sumber

Jawaban:

126

Untuk C-runtime, buka pengaturan proyek, pilih C / C ++ lalu 'Pembuatan Kode'. Ubah pengaturan 'runtime library' menjadi 'multithreaded' bukan 'multithreaded dll'.

Jika Anda menggunakan perpustakaan lain, Anda mungkin perlu memberi tahu penaut untuk mengabaikan CRT yang ditautkan secara dinamis secara eksplisit.

Rob Walker
sumber
"Jika Anda menggunakan pustaka lain, Anda mungkin perlu memberi tahu linker untuk mengabaikan CRT yang ditautkan secara dinamis secara eksplisit." Baru-baru ini saya mengalami masalah ini. Saya sedang membangun aplikasi wxWidgets, saya merasa perlu membangun kembali wxWidgets libs dengan modifikasi pembuatan kode yang sama
Bill Forster
6
Karakter manusia 300 tidak banyak. Jika komentar di atas tidak jelas, masalahnya adalah bahwa file .cpp Anda dan file .cpp perpustakaan apa pun harus memiliki 'multithreaded' daripada 'multithreaded dll' jika tidak, Anda mungkin mendapatkan kesalahan tautan.
Bill Forster
Ini menimbulkan banyak masalah terkait pengelolaan heap yang mungkin tidak ingin Anda lakukan.
Edward Strange
Untuk perpustakaan CRT, VS menyediakan opsi / MD & / MT. Tapi, bagaimana dengan menautkan pustaka lain secara statis secara umum - katakanlah, libX.lib (yang bisa berupa pustaka saya sendiri atau pustaka pihak ketiga)?
Kiran MN
4
Saya mengerti error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. Apakah ada tempat lain untuk mengubah jenis bangunan? Saya sedang membangun aplikasi wxWigets, seperti @BillForster. Jadi, apakah saya harus membangun kembali wxWidgets? Bagaimana aku melakukan itu?
Tomáš Zato - Kembalikan Monica
18

Pengalaman saya di Visual Studio 2010 adalah bahwa ada dua perubahan yang diperlukan agar tidak memerlukan DLL. Dari halaman properti proyek (klik kanan pada nama proyek di jendela Solution Explorer):

  1. Di bawah Properti Konfigurasi -> Umum, ubah bidang "Penggunaan MFC" menjadi "Gunakan MFC di Perpustakaan Statis".

  2. Di bawah Properti Konfigurasi -> C / C ++ -> Pembuatan Kode, ubah bidang "Perpustakaan Waktu Proses" menjadi "Multi-Threaded (/ MT)"

Tidak yakin mengapa keduanya dibutuhkan. Saya menggunakan ini untuk menghapus ketergantungan pada glut32.dll.

Ditambahkan nanti: Saat membuat perubahan ini pada konfigurasi, Anda harus membuatnya menjadi "Semua Konfigurasi" --- Anda dapat memilih ini di bagian atas jendela Properties. Jika Anda membuat perubahan hanya pada konfigurasi Debug, itu tidak akan berlaku untuk konfigurasi Rilis, dan sebaliknya.

Sam Buss
sumber
1
Ini tampaknya berfungsi di Visual Studio 2013 dengan satu tambahan kecil: Saya harus mengubah Properti Konfigurasi -> Umum -> Set Karakter ke "Gunakan Set Karakter Unicode".
gnovice
4

Saya memiliki masalah ketergantungan yang sama dan saya juga tahu bahwa Anda dapat menyertakan VS 8.0 DLL (hanya rilis! Bukan debug! --- dan program Anda juga harus dirilis) dalam folder dengan nama yang sesuai, di folder induk dengan .exe Anda:

Cara: Menerapkan menggunakan XCopy (MSDN)

Perhatikan juga bahwa semuanya dijamin menjadi kacau jika Anda perlu memiliki kode C ++ dan C dalam .exe yang terhubung secara statis karena Anda akan mendapatkan konflik linker yang hanya dapat diselesaikan dengan mengabaikan libXXX.lib yang benar dan kemudian menautkan secara dinamis (DLL) .

Terakhir, dengan toolset yang berbeda (VC ++ 6.0) hal-hal "hanya berfungsi", karena Windows 2000 dan yang lebih baru memiliki DLL yang benar diinstal.

Jared Updike
sumber
1

Berkenaan dengan tanggapan Jared, memiliki Windows 2000 atau lebih baik belum tentu memperbaiki masalah yang dihadapi. Tanggapan Rob berhasil, namun ada kemungkinan bahwa perbaikan ini menimbulkan masalah keamanan, karena pembaruan Windows tidak akan dapat menambal aplikasi yang dibuat seperti itu.

Di posting lain, Nick Guerrera menyarankan untuk mengemas Visual C ++ Runtime Redistributable dengan aplikasi Anda, yang menginstal dengan cepat, dan tidak bergantung pada Visual Studio.

bunkerdive
sumber
2
Meskipun pengemasan yang dapat didistribusikan ulang tampaknya menjadi solusi yang disukai, Anda memerlukan admin privs untuk menjalankan penginstal yang dapat didistribusikan ulang. Itu bukan opsi yang layak jika Anda memiliki pengguna non-admin.
Kevin Condon