คำถามติดแท็ก linker

ตัวเชื่อมโยงเป็นส่วนหนึ่งของ toolchain สำหรับการสร้างไฟล์ปฏิบัติการจากซอร์สโค้ดที่เขียนด้วยภาษาโปรแกรมที่คอมไพล์ ใช้รหัสออบเจ็กต์ที่คอมไพล์แล้วในไฟล์หลายไฟล์และสร้างไฟล์ปฏิบัติการไฟล์เดียวที่ "เชื่อมโยง"

12
เป็นไปได้หรือไม่ที่จะรวบรวม Python เป็นรหัสเครื่อง
เป็นไปได้แค่ไหนที่จะรวบรวม Python (อาจผ่านการแทนค่า C ระดับกลาง) ลงในรหัสเครื่อง สันนิษฐานว่าจำเป็นต้องเชื่อมโยงไปยังไลบรารีรันไทม์ของ Python และส่วนใด ๆ ของไลบรารีมาตรฐาน Python ซึ่งเป็น Python เองก็จำเป็นต้องคอมไพล์ (และเชื่อมโยง) ด้วย นอกจากนี้คุณจะต้องรวมตัวแปล Python หากคุณต้องการทำการประเมินนิพจน์แบบไดนามิก แต่อาจเป็นชุดย่อยของ Python ที่ไม่อนุญาตให้ทำสิ่งนี้ก็ยังมีประโยชน์ จะให้ข้อได้เปรียบด้านความเร็วและ / หรือการใช้งานหน่วยความจำหรือไม่? สันนิษฐานว่าเวลาเริ่มต้นของตัวแปล Python จะถูกตัดออก (แม้ว่าไลบรารีที่ใช้ร่วมกันจะยังคงต้องโหลดเมื่อเริ่มต้น)
128 python  c  linker  compilation 

5
ฉันจะกำหนดสถาปัตยกรรมเป้าหมายของไลบรารีแบบคงที่ (.a) บน Mac OS X ได้อย่างไร
ฉันสนใจที่จะตรวจสอบว่ามีการสร้างไลบรารีแบบคงที่ของ iPhone สำหรับ ARM หรือ Intel หรือไม่ มันเป็นความอยากรู้อยากเห็นมากกว่าสิ่งใด มีเครื่องมือเฉพาะของ MacOS X หรือ BSD สำหรับทำสิ่งนี้หรือไม่? โพสต์นี้ให้ตัวอย่างใน Linux

1
จะเกิดอะไรขึ้นกับตัวแปรส่วนกลางและตัวแปรคงที่ในไลบรารีที่ใช้ร่วมกันเมื่อมีการเชื่อมโยงแบบไดนามิก
ฉันกำลังพยายามทำความเข้าใจว่าเกิดอะไรขึ้นเมื่อโมดูลที่มี globals และตัวแปรคงที่เชื่อมโยงกับแอปพลิเคชันแบบไดนามิก ตามโมดูลฉันหมายถึงแต่ละโครงการในโซลูชัน (ฉันทำงานกับสตูดิโอภาพเยอะมาก!) โมดูลเหล่านี้มีอยู่ในตัว * .lib หรือ * .dll หรือตัว * .exe เอง ฉันเข้าใจว่าไบนารีของแอปพลิเคชันมีข้อมูลส่วนกลางและแบบคงที่ของหน่วยการแปลแต่ละหน่วย (ไฟล์ออบเจ็กต์) ในส่วนข้อมูล (และอ่านเฉพาะส่วนข้อมูลหาก const) จะเกิดอะไรขึ้นเมื่อแอปพลิเคชันนี้ใช้โมดูล A ที่มีการเชื่อมโยงแบบไดนามิกในเวลาโหลด ฉันถือว่า DLL มีส่วนสำหรับโลกและสถิตยศาสตร์ ระบบปฏิบัติการโหลดหรือไม่ ถ้าเป็นเช่นนั้นจะโหลดไปที่ใด และจะเกิดอะไรขึ้นเมื่อแอปพลิเคชันใช้โมดูล B พร้อมการเชื่อมโยงแบบไดนามิกรันไทม์ หากฉันมีโมดูลสองโมดูลในแอปพลิเคชันของฉันที่ทั้งสองใช้ A และ B สำเนาของโลกของ A และ B จะถูกสร้างขึ้นตามที่ระบุไว้ด้านล่าง (หากเป็นกระบวนการที่แตกต่างกัน) DLLs A และ B สามารถเข้าถึงแอปพลิเคชัน globals ได้หรือไม่ (โปรดระบุเหตุผลของคุณด้วย) อ้างจากMSDN …

4
ลิงค์เกอร์ทำอะไร?
ฉันสงสัยมาตลอด ฉันรู้ว่าคอมไพเลอร์แปลงโค้ดที่คุณเขียนเป็นไบนารี แต่ลิงก์เกอร์จะทำอย่างไร พวกเขาเป็นปริศนาสำหรับฉันมาตลอด ฉันเข้าใจคร่าวๆว่า 'การเชื่อมโยง' คืออะไร เมื่อมีการเพิ่มการอ้างอิงถึงไลบรารีและเฟรมเวิร์กลงในไบนารี ฉันไม่เข้าใจอะไรที่นอกเหนือไปจากนั้น สำหรับฉันมัน "ใช้ได้" ฉันยังเข้าใจพื้นฐานของการเชื่อมโยงแบบไดนามิก แต่ไม่มีอะไรลึกซึ้งเกินไป ใครช่วยอธิบายเงื่อนไข

2
โปรแกรม Small Haskell ที่คอมไพล์ด้วย GHC เป็นไบนารีขนาดใหญ่
แม้แต่โปรแกรม Haskell ขนาดเล็กเล็กน้อยก็กลายเป็นโปรแกรมปฏิบัติการขนาดมหึมา ฉันได้เขียนโปรแกรมขนาดเล็กที่คอมไพล์ (ด้วย GHC) เป็นไบนารีโดยมีขนาดขยาย 7 MB! อะไรทำให้แม้แต่โปรแกรม Haskell ขนาดเล็กที่คอมไพล์เป็นไบนารีขนาดใหญ่ได้ ฉันจะทำอะไรได้บ้างเพื่อลดสิ่งนี้

1
แฟล็ก -all_load linker ทำอะไร
ฉันไม่พบว่าแฟล็ก -all_load ทำอะไรเมื่อคอมไพล์โค้ด Objective-C ฉันมีปัญหาบางอย่างในการอัปโหลดไบนารีไปยัง Apple พวกเขาบอกว่าเป็นเพราะฉันไม่ได้ใช้แฟล็กนี้ แต่โค้ดของฉันรวบรวมได้แม้ว่าจะไม่มีก็ตาม มีใครช่วยฉันได้ไหม ขอบคุณ

8
Visual C ++: จะปิดใช้งานคำเตือนตัวเชื่อมโยงเฉพาะได้อย่างไร
ฉันใช้ไลบรารีจาก CGAL ซึ่งในระหว่างขั้นตอนการเชื่อมโยงของการคอมไพล์โค้ดของฉันสร้างคำเตือนการเชื่อมโยงจำนวนมากในแบบฟอร์มนี้: warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info ฉันจะปิดคำเตือนตัวเชื่อมโยงเฉพาะนี้ภายใต้ Visual C ++ / Studio 2008 ได้อย่างไร โปรดทราบว่าฉันไม่มีการควบคุมใด ๆ ในไลบรารีภายนอก (CGAL) ที่ฉันใช้อยู่ ฉันไม่สามารถ / ไม่ต้องการที่จะคอมไพล์ห้องสมุดภายนอกใหม่ ดังนั้นจำเป็นต้องแก้ไขข้อความในตอนท้ายของฉัน

23
เหตุใดข้อผิดพลาดร้ายแรง“ LNK1104: ไม่สามารถเปิดไฟล์ 'C: \ Program.obj'” เกิดขึ้นเมื่อฉันรวบรวมโปรเจ็กต์ C ++ ใน Visual Studio
ฉันได้สร้างโปรเจ็กต์ C ++ ใหม่ใน Visual Studio 2008 ยังไม่มีการเขียนโค้ด มีการเปลี่ยนแปลงการตั้งค่าโปรเจ็กต์เท่านั้น เมื่อฉันรวบรวมโครงการฉันได้รับข้อผิดพลาดร้ายแรงต่อไปนี้: ข้อผิดพลาดร้ายแรง LNK1104: ไม่สามารถเปิดไฟล์ 'C: \ Program.obj'
117 visual-c++  linker 

4
ฉันจะเชื่อมโยงไปยังเวอร์ชัน glibc เฉพาะได้อย่างไร
เมื่อฉันรวบรวมบางสิ่งบนพีซี Ubuntu Lucid 10.04 ของฉันมันจะเชื่อมโยงกับ glibc Lucid ใช้ glibc 2.11 เมื่อฉันเรียกใช้ไบนารีนี้บนพีซีเครื่องอื่นที่มี glibc รุ่นเก่าคำสั่งล้มเหลวโดยบอกว่าไม่มี glibc 2.11 ... เท่าที่ฉันรู้ glibc ใช้การกำหนดเวอร์ชันสัญลักษณ์ ฉันบังคับให้ gcc เชื่อมโยงกับเวอร์ชันสัญลักษณ์เฉพาะได้หรือไม่ ในการใช้งานจริงของฉันฉันพยายามรวบรวม gcc cross toolchain สำหรับ ARM
111 linux  gcc  linker  glibc  libc 

4
ฉันจะสร้าง. exe ที่เชื่อมโยงแบบคงที่โดยสมบูรณ์ด้วย Visual Studio Express 2005 ได้อย่างไร
สภาพแวดล้อม 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 เก่า …

8
การลิงก์แบบคงที่เฉพาะบางไลบรารี
ฉันจะลิงก์เฉพาะไลบรารีเฉพาะบางส่วนกับไบนารีของฉันได้อย่างไรเมื่อเชื่อมโยงกับ GCC gcc ... -static ...พยายามเชื่อมโยงไลบรารีที่เชื่อมโยงทั้งหมดแบบคงที่แต่ฉันไม่มีเวอร์ชันคงที่ของบางไลบรารี (เช่น libX11)


6
__gxx_personality_v0 คืออะไร?
นี่เป็นคำถามมือสองจากไซต์การพัฒนาระบบปฏิบัติการ แต่มันทำให้ฉันสงสัยเพราะฉันไม่สามารถหาคำอธิบายที่ดีได้จากที่ใด เมื่อรวบรวมและเชื่อมโยงโปรแกรม C ++ แบบอิสระโดยใช้ gcc บางครั้งข้อผิดพลาดของตัวเชื่อมโยงเช่นนี้จะเกิดขึ้น: out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' เห็นได้ชัดว่าเป็นเพราะสัญลักษณ์นี้ถูกกำหนดใน libstdc ++ ซึ่งขาดหายไปในสภาพแวดล้อมอิสระ การแก้ไขปัญหาเพียงแค่กำหนดสัญลักษณ์นี้ไว้ที่ใดที่หนึ่ง: void *__gxx_personality_v0; ซึ่งดี แต่ฉันไม่ชอบสิ่งที่ใช้งานได้อย่างมหัศจรรย์ ... คำถามคือจุดประสงค์ของสัญลักษณ์นี้คืออะไร?
103 c++  gcc  linker  kernel 

3
การเชื่อมโยงวัตถุ C ++ 17, C ++ 14 และ C ++ 11 นั้นปลอดภัยหรือไม่
สมมติว่าฉันมีออบเจ็กต์ที่คอมไพล์สามชิ้นทั้งหมดสร้างโดยคอมไพเลอร์ / เวอร์ชันเดียวกัน : A ถูกรวบรวมด้วยมาตรฐาน C ++ 11 B ถูกรวบรวมด้วยมาตรฐาน C ++ 14 C ถูกคอมไพล์ด้วยมาตรฐาน C ++ 17 เพื่อความเรียบง่ายสมมติว่าส่วนหัวทั้งหมดเขียนด้วย C ++ 11 โดยใช้เฉพาะโครงสร้างที่ความหมายไม่ได้เปลี่ยนแปลงระหว่างเวอร์ชันมาตรฐานทั้งสามดังนั้นการพึ่งพาระหว่างกันจึงถูกแสดงอย่างถูกต้องด้วยการรวมส่วนหัวและคอมไพเลอร์ไม่คัดค้าน การรวมกันของวัตถุเหล่านี้คืออะไรและไม่ปลอดภัยที่จะเชื่อมโยงเป็นไบนารีเดียว? ทำไม? แก้ไข: ยินดีต้อนรับคำตอบที่ครอบคลุมคอมไพเลอร์หลัก (เช่น gcc, clang, vs ++)
103 c++  c++11  linker  c++14  abi 

16
การแบ่งคลาส C ++ แบบเทมเพลเป็นไฟล์. hpp / .cpp - เป็นไปได้ไหม
ฉันได้รับข้อผิดพลาดในการพยายามรวบรวมคลาสเทมเพลต C ++ ซึ่งแยกระหว่าง a .hppและ.cppไฟล์: $ g++ -c -o main.o main.cpp $ g++ -c -o stack.o stack.cpp $ g++ -o main main.o stack.o main.o: In function `main': main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()' main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()' collect2: ld returned 1 exit status make: *** [program] Error 1 นี่คือรหัสของฉัน: …

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