ฉันจะสร้าง. exe ที่เชื่อมโยงแบบคงที่โดยสมบูรณ์ด้วย Visual Studio Express 2005 ได้อย่างไร


109

สภาพแวดล้อม C ++ ที่ฉันต้องการในปัจจุบันคือ Microsoft Visual Studio 2005 Express edition ฟรีและยอดเยี่ยมมาก บางครั้งฉันได้ส่งไฟล์. exe ไปยังบุคคลอื่นด้วยผลลัพธ์ที่น่าพึงพอใจ อย่างไรก็ตามเมื่อไม่นานมานี้ฉันได้ค้นพบที่น่าวิตกว่าผลลัพธ์ที่น่าพึงพอใจนั้นขึ้นอยู่กับโชคที่ฉันต้องการมากกว่า ความพยายามที่จะเรียกใช้โปรแกรมเหล่านี้บนกล่อง XP (รุ่นเก่าปี 2001 ไม่ได้รับการอัปเดตอย่างรอบคอบ) ทำให้ฉันไม่มีอะไรนอกจากข้อความ "System can't run x.exe" (หรือคล้ายกัน) ที่น่ารังเกียจ

googling บางคนเปิดเผยว่าด้วยชุดเครื่องมือนี้แม้กระทั่งการระบุผลลัพธ์การลิงก์แบบคงที่ใน hello-world.exe ที่เรียบง่ายโดยอาศัยไฟล์. dll พิเศษ (msvcm80.dll เป็นต้น) ระบบแผนผังเวอร์ชันที่ซับซ้อนอย่างไม่น่าเชื่อ (ไฟล์รายการทุกคน?) จะไม่ปล่อยให้. exe ทำงานโดยไม่มีเวอร์ชัน. dll ที่ถูกต้อง ฉันไม่ต้องการหรือต้องการสิ่งนี้ฉันแค่ต้องการ. exe แบบเก่าที่มีอยู่ในตัวเองที่ไม่ทำอะไรเลยนอกจากการดำเนินการ Win32 ตัวหารทั่วไปที่ต่ำที่สุดและทำงานบน win32 OS เก่า ๆ

มีใครรู้บ้างว่าเป็นไปได้ไหมที่จะทำในสิ่งที่ฉันต้องการกับชุดเครื่องมือที่มีอยู่

ขอบคุณ.

คำตอบ:


127

สำหรับ C-runtime ไปที่การตั้งค่าโปรเจ็กต์เลือก C / C ++ จากนั้นเลือก 'Code Generation' เปลี่ยนการตั้งค่า 'runtime library' เป็น 'multithreaded' แทน 'multithreaded dll'

หากคุณกำลังใช้ไลบรารีอื่น ๆ คุณอาจต้องบอกผู้เชื่อมโยงให้ละเว้น CRT ที่เชื่อมโยงแบบไดนามิกอย่างชัดเจน


"หากคุณกำลังใช้ไลบรารีอื่น ๆ คุณอาจต้องบอกผู้เชื่อมโยงให้ละเว้น CRT ที่เชื่อมโยงแบบไดนามิกอย่างชัดเจน" เมื่อเร็ว ๆ นี้ฉันพบปัญหานี้ ฉันกำลังสร้างแอป wxWidgets ฉันพบว่าฉันจำเป็นต้องสร้าง libs wxWidgets ใหม่ด้วยการปรับเปลี่ยนการสร้างรหัสเดียวกัน
Bill Forster

6
ผู้ชาย 300 ตัวไม่เยอะ ในกรณีที่ความคิดเห็นด้านบนไม่ชัดเจนปัญหาคือทั้งไฟล์. cpp และไฟล์. cpp ของไลบรารีใด ๆ จำเป็นต้องมี "มัลติเธรด" แทน "dll แบบมัลติเธรด" มิฉะนั้นคุณอาจได้รับข้อผิดพลาดในการเชื่อมโยง
Bill Forster

สิ่งนี้แนะนำประเด็นมากมายเกี่ยวกับการจัดการฮีปที่คุณอาจไม่ต้องการทำอะไรเลย
Edward Strange

สำหรับไลบรารี CRT VS มีตัวเลือก / MD & / MT แต่สิ่งที่เกี่ยวกับการเชื่อมโยงไลบรารีอื่น ๆ แบบคงที่โดยทั่วไปเช่น libX.lib (ซึ่งอาจเป็นไลบรารีของฉันเองหรือไลบรารีของบุคคลที่สาม)
Kiran MN

4
ฉันเข้าใจerror LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'แล้ว มีที่อื่นให้เปลี่ยนประเภทของงานสร้างหรือไม่? ฉันกำลังสร้างแอปพลิเคชัน wxWigets เหมือนกับ @BillForster ฉันจะต้องสร้าง wxWidgets ใหม่หรือไม่? ฉันจะทำอย่างไร?
Tomáš Zato - คืนสถานะ Monica

19

ประสบการณ์ของฉันใน Visual Studio 2010 คือมีการเปลี่ยนแปลงสองอย่างที่จำเป็นเพื่อที่จะไม่ต้องใช้ DLL จากหน้าคุณสมบัติโครงการ (คลิกขวาที่ชื่อโครงการในหน้าต่าง Solution Explorer):

  1. ภายใต้คุณสมบัติการกำหนดค่า -> ทั่วไปให้เปลี่ยนช่อง "การใช้ MFC" เป็น "ใช้ MFC ในไลบรารีแบบคงที่"

  2. ภายใต้คุณสมบัติการกำหนดค่า -> C / C ++ -> การสร้างโค้ดให้เปลี่ยนฟิลด์ "Runtime Library" เป็น "Multi-Threaded (/ MT)"

ไม่แน่ใจว่าทำไมทั้งคู่ถึงต้องการ ฉันใช้สิ่งนี้เพื่อลบการพึ่งพา glut32.dll

เพิ่มในภายหลัง: เมื่อทำการเปลี่ยนแปลงเหล่านี้ในการกำหนดค่าคุณควรทำให้เป็น "การกำหนดค่าทั้งหมด" --- คุณสามารถเลือกได้ที่ด้านบนของหน้าต่างคุณสมบัติ หากคุณทำการเปลี่ยนแปลงเป็นเพียงการกำหนดค่าการดีบักจะไม่มีผลกับการกำหนดค่ารุ่นและในทางกลับกัน


1
ดูเหมือนว่าจะใช้งานได้ใน Visual Studio 2013 ด้วยการเพิ่มเล็กน้อย: ฉันต้องเปลี่ยน Configuration Properties -> General -> Character Set เป็น "Use Unicode Character Set"
gnovice

4

ฉันมีปัญหาการพึ่งพาเดียวกันนี้และฉันก็รู้ด้วยว่าคุณสามารถรวม VS 8.0 DLLs (รีลีสเท่านั้น! โฟลเดอร์หลักที่มี. exe ของคุณ:

วิธีการ: ปรับใช้โดยใช้ XCopy (MSDN)

นอกจากนี้โปรดทราบว่าสิ่งต่าง ๆ ได้รับการประกันว่าจะผิดพลาดหากคุณจำเป็นต้องมีรหัส C ++ และ C ใน. exe ที่เชื่อมโยงแบบสแตติกเดียวกันเนื่องจากคุณจะได้รับข้อขัดแย้งของตัวเชื่อมโยงที่สามารถแก้ไขได้โดยการละเว้น libXXX.lib ที่ถูกต้องจากนั้นเชื่อมโยงแบบไดนามิก (DLL) .

สุดท้ายด้วยชุดเครื่องมืออื่น (VC ++ 6.0) สิ่งที่ "ใช้ได้" เนื่องจาก Windows 2000 ขึ้นไปมีการติดตั้ง DLL ที่ถูกต้อง


1

สำหรับการตอบสนองของ Jared การมี Windows 2000 ขึ้นไปไม่จำเป็นต้องแก้ไขปัญหาในมือ การตอบสนองของ Rob ใช้งานได้ แต่เป็นไปได้ว่าการแก้ไขนี้ทำให้เกิดปัญหาด้านความปลอดภัยเนื่องจากการอัปเดต Windows จะไม่สามารถแก้ไขแอปพลิเคชันที่สร้างขึ้นเช่นนี้ได้

ในโพสต์อื่น Nick Guerrera แนะนำการบรรจุ Visual C ++ Runtime Redistributable กับแอปพลิเคชันของคุณซึ่งติดตั้งได้อย่างรวดเร็วและไม่ขึ้นอยู่กับ Visual Studio


2
ในขณะที่บรรจุภัณฑ์ที่สามารถแจกจ่ายต่อได้ดูเหมือนจะเป็นโซลูชันที่ต้องการ แต่คุณต้องมีสิทธิ์ผู้ดูแลระบบเพื่อเรียกใช้โปรแกรมติดตั้งที่แจกจ่ายต่อได้ นั่นไม่ใช่ตัวเลือกที่ใช้ได้หากคุณมีผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบ
Kevin Condon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.