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

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

15
การฝัง DLLs ในการปฏิบัติการที่คอมไพล์แล้ว
เป็นไปได้หรือไม่ที่จะฝัง DLL ที่มีอยู่แล้วลงในไฟล์ประมวลผล C # ที่คอมไพล์แล้ว (เพื่อให้คุณมีไฟล์เดียวที่จะเผยแพร่) ถ้าเป็นไปได้คนจะทำยังไงดีล่ะ? โดยปกติแล้วฉันเจ๋งเพียงแค่ออกจาก DLL ภายนอกและให้โปรแกรมติดตั้งจัดการทุกอย่าง แต่มีคนทำงานอยู่สองคนที่ถามฉันและฉันก็ไม่รู้เหมือนกัน
618 c#  .net  dll  merge  linker 


6
กระบวนการรวบรวม / เชื่อมโยงทำงานอย่างไร
กระบวนการรวบรวมและเชื่อมโยงทำงานอย่างไร (หมายเหตุ: นี่คือหมายถึงการเป็นรายการที่จะกองมากเกินของ C ++ คำถามที่พบบ่อย . ถ้าคุณต้องการที่จะวิจารณ์ความคิดของการให้คำถามที่พบบ่อยในรูปแบบนี้แล้วโพสต์บนเมตาที่เริ่มต้นทั้งหมดนี้ . จะเป็นสถานที่ที่จะทำเช่นนั้นได้คำตอบ คำถามนั้นได้รับการตรวจสอบในห้องสนทนา C ++ซึ่งแนวคิด FAQ เริ่มต้นตั้งแต่แรกดังนั้นคำตอบของคุณมีโอกาสมากที่จะได้รับการอ่านโดยผู้ที่คิดแนวคิดนี้)

4
ความแตกต่างระหว่างวัตถุที่ใช้ร่วมกัน (.so), ไลบรารีแบบคงที่ (.a) และ DLL ของ (.so) หรือไม่
ฉันมีส่วนร่วมในการอภิปรายบางอย่างเกี่ยวกับห้องสมุดใน Linux และต้องการยืนยันบางสิ่ง มันเป็นความเข้าใจของฉัน (โปรดแก้ไขให้ฉันถ้าฉันผิดและฉันจะแก้ไขโพสต์ของฉันในภายหลัง) ว่ามีสองวิธีในการใช้ห้องสมุดเมื่อสร้างแอปพลิเคชัน: สแตติกไลบรารี (ไฟล์. a): ณ เวลาลิงก์สำเนาของไลบรารีทั้งหมดจะถูกใส่ลงในแอปพลิเคชันสุดท้ายเพื่อให้ฟังก์ชั่นภายในไลบรารีพร้อมใช้งานสำหรับแอปพลิเคชันการโทรตลอดเวลา วัตถุที่ใช้ร่วมกัน (ไฟล์. so): ณ เวลาลิงก์วัตถุนั้นจะถูกตรวจสอบกับ API ผ่านไฟล์ส่วนหัว (.h) ที่เกี่ยวข้อง ห้องสมุดไม่ได้ใช้จริงจนกว่ารันไทม์ซึ่งเป็นที่ต้องการ ข้อได้เปรียบที่ชัดเจนของสแตติกไลบรารีคือพวกเขาอนุญาตให้แอปพลิเคชันทั้งหมดอยู่ในตัวเองในขณะที่ประโยชน์ของไลบรารีแบบไดนามิกคือสามารถแทนที่ไฟล์ ".so" (เช่น: ในกรณีที่จำเป็นต้องอัปเดตเนื่องจากความปลอดภัย บั๊ก) โดยไม่ต้องการให้แอปพลิเคชันพื้นฐานทำการคอมไพล์ใหม่ ฉันเคยได้ยินบางคนสร้างความแตกต่างระหว่างวัตถุที่ใช้ร่วมกันและไลบรารีที่เชื่อมโยงแบบไดนามิก (DLL's) แม้ว่าพวกเขาจะเป็นทั้งไฟล์ ".so" ก็ตาม มีความแตกต่างระหว่างวัตถุที่ใช้ร่วมกันและ DLLs เมื่อมันมาถึงการพัฒนา C / C ++ บน Linux หรือระบบปฏิบัติการที่สอดคล้องกับ POSIX อื่น ๆ (เช่น: MINIX, UNIX, QNX, ฯลฯ …
272 c++  c  linux  dll  linker 

5
'ลิงก์แบบสแตติก' และ 'ลิงก์แบบไดนามิก' หมายถึงอะไร
ผมมักจะได้ยินคำว่า 'เชื่อมโยงแบบคง' และ 'เชื่อมโยงแบบไดนามิก' มักจะอยู่ในการอ้างอิงถึงรหัสที่เขียนในC , C ++หรือC # พวกเขาคืออะไรพวกเขากำลังพูดถึงอะไรกันแน่และพวกเขากำลังเชื่อมโยงอะไรกัน?

5
การแก้ไข LNK4098: defaultlib 'MSVCRT' ขัดแย้งกับ
คำเตือนนี้: LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library เป็นคำเตือนทั่วไปใน Visual Studio ฉันต้องการที่จะเข้าใจเหตุผลที่แน่นอนสำหรับมันและวิธีการที่ถูกต้อง (ถ้าทั้งหมด) เพื่อจัดการกับมัน /MDdนี้เกิดขึ้นในการแก้ปัญหาการสร้างรวบรวมกับ โครงการเชื่อมโยงกับสิ่งที่ชอบหน้าต่างVersion.dllและที่ตัวเองเชื่อมโยงกับpdh.dll MSVCRT.dllเห็นได้ชัดว่าฉันไม่มีเวอร์ชันแก้ไขข้อบกพร่องเหล่านี้และไม่สามารถรวบรวมได้ ดังนั้นฉันเพิ่ม/NODEFAULTLIB:MSVCRTเข้าไปในบรรทัดคำสั่งของ linker และมันก็ลบคำเตือนออก แต่สิ่งนี้ทำอะไรได้จริง? และทำไมมันจำเป็น?

17
g ++ การอ้างอิงที่ไม่ได้กำหนดไปยัง typeinfo
ฉันเพิ่งพบข้อผิดพลาดต่อไปนี้ (และพบวิธีแก้ปัญหาออนไลน์ แต่ไม่มีอยู่ใน Stack Overflow): (.gnu.linkonce. [stuff]): การอ้างอิงที่ไม่ได้กำหนดถึง [method] [object file] :(. gnu.linkonce. [stuff]): การอ้างอิงที่ไม่ได้กำหนดให้กับ `typeinfo สำหรับ [classname] ' เหตุใดเราจึงอาจได้รับข้อผิดพลาด "การอ้างอิงที่ไม่ได้ระบุถึงตัวเชื่อมโยง typeinfo" อย่างใดอย่างหนึ่งเหล่านี้ (คะแนนโบนัสหากคุณสามารถอธิบายสิ่งที่เกิดขึ้นเบื้องหลัง)
209 c++  linker  g++ 

14
libpthread.so.0: ข้อผิดพลาดการเพิ่มสัญลักษณ์: DSO หายไปจากบรรทัดคำสั่ง
เมื่อฉันรวบรวม openvswitch-1.5.0 ฉันพบข้อผิดพลาดในการคอมไพล์ต่อไปนี้: gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init -g -O2 -export-dynamic ***-lpthread*** -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a /home/jyyoo/src/dpdk/build/lib/librte_eal.a /home/jyyoo/src/dpdk/build/lib/libethdev.a /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a /home/jyyoo/src/dpdk/build/lib/librte_hash.a /home/jyyoo/src/dpdk/build/lib/librte_lpm.a /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a /home/jyyoo/src/dpdk/build/lib/librte_ring.a /home/jyyoo/src/dpdk/build/lib/librte_mempool.a /home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm /usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5' /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: …

11
“ / usr / bin / ld: ไม่พบ -lz”
ฉันพยายามรวบรวมซอร์สโค้ด Android ภายใต้ Ubuntu 10.04 ฉันพบข้อผิดพลาด / usr / bin / ld: ไม่พบ -lz คุณช่วยบอกฉันทีว่าฉันจะแก้ไขได้อย่างไร อะไรcannot find -lzหมายถึง? นี่คือข้อความแสดงข้อผิดพลาด: external/qemu/Makefile.android:1101: warning: overriding commands for target `external/qemu/android/avd/hw-config-defs.h' external/qemu/Makefile.android:933: warning: ignoring old commands for target `external/qemu/android/avd/hw-config-defs.h' host SharedLib: libneo_cgi (out/host/linux-x86/obj/lib/libneo_cgi.so) /usr/bin/ld: skipping incompatible /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../libz.so when searching for -lz /usr/bin/ld: skipping incompatible /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../libz.a …
172 linux  gcc  linker 

7
ld ไม่พบห้องสมุดที่มีอยู่
ฉันกำลังพยายามเชื่อมโยงแอปพลิเคชันกับ g ++ บนระบบ Debian lenny นี้ ld กำลังบ่นว่าไม่พบไลบรารีที่ระบุ ตัวอย่างเฉพาะที่นี่คือ ImageMagick แต่ฉันมีปัญหาที่คล้ายกันกับห้องสมุดอื่น ๆ น้อยเกินไป ฉันกำลังเรียกลิงเกอร์ด้วย: g++ -w (..lots of .o files/include directories/etc..) \ -L/usr/lib -lmagic ld บ่น: /usr/bin/ld: cannot find -lmagic อย่างไรก็ตาม libmagic มีอยู่: $ locate libmagic.so /usr/lib/libmagic.so.1 /usr/lib/libmagic.so.1.0.0 $ ls -all /usr/lib/libmagic.so.1* lrwxrwxrwx 1 root root 17 2008-12-01 03:52 …


6
การเชื่อมโยงไลบรารีแบบคงที่กับไลบรารีแบบคงที่อื่น ๆ
ฉันมีโค้ดชิ้นเล็ก ๆ ที่ขึ้นอยู่กับไลบรารีแบบคงที่จำนวนมาก (a_1-a_n) ฉันต้องการจัดแพ็กเกจโค้ดนั้นในไลบรารีแบบคงที่และทำให้คนอื่น ๆ สามารถใช้งานได้ ห้องสมุดคงที่ของฉันเรียกมันว่า X รวบรวมได้ดี ฉันได้สร้างโปรแกรมตัวอย่างง่ายๆที่ใช้ฟังก์ชันจาก X แต่เมื่อฉันพยายามเชื่อมโยงกับ X ฉันได้รับข้อผิดพลาดมากมายเกี่ยวกับสัญลักษณ์ที่หายไปจากไลบรารี a_1 - a_n มีวิธีใดบ้างที่ฉันสามารถสร้างไลบรารีแบบคงที่ Y ที่มี X และฟังก์ชันทั้งหมดที่ต้องการโดย X (บิตที่เลือกจาก a_1 - a_n) เพื่อให้ฉันสามารถแจกจ่ายเฉพาะ Y เพื่อให้ผู้คนเชื่อมโยงโปรแกรมของตนได้ อัพเดท: ฉันดูแค่การทิ้งทุกอย่างด้วยarและสร้าง mega-lib หนึ่งอัน แต่สุดท้ายก็มีสัญลักษณ์มากมายที่ไม่จำเป็น (ไฟล์. o ทั้งหมดมีขนาดประมาณ 700 MB อย่างไรก็ตามไฟล์ปฏิบัติการที่เชื่อมโยงแบบคงที่คือ 7 MB). มีวิธีที่ดีในการรวมเฉพาะสิ่งที่จำเป็นจริงหรือไม่? สิ่งนี้มีความเกี่ยวข้องอย่างใกล้ชิดกับวิธีการรวมไลบรารี C / C ++ …
142 c++  linker  ar  .a 

5
ไฟล์วัตถุใน C คืออะไร?
ฉันกำลังอ่านเกี่ยวกับไลบรารีใน C แต่ฉันยังไม่พบคำอธิบายเกี่ยวกับวัตถุไฟล์ อะไรคือความแตกต่างที่แท้จริงระหว่างไฟล์ที่คอมไพล์แล้วกับไฟล์ออบเจ็กต์? ฉันจะดีใจถ้ามีใครสามารถอธิบายเป็นภาษามนุษย์ได้

2
การบอก gcc โดยตรงเพื่อเชื่อมโยงไลบรารีแบบคงที่
รู้สึกแปลกสำหรับฉันที่จะใช้-Wl,-Bstaticเพื่อบอกว่าgccฉันต้องการเชื่อมโยงกับไลบรารีใดแบบคงที่ ท้ายที่สุดฉันบอกgccข้อมูลอื่น ๆ โดยตรงเกี่ยวกับการเชื่อมโยงกับไลบรารี ( -Ldir, -llibname) เป็นไปได้หรือไม่ที่จะบอกไดรเวอร์ gcc โดยตรงว่าควรเชื่อมโยงไลบรารีใดแบบคงที่ คำชี้แจง:ฉันรู้ว่าหากห้องสมุดบางแห่งมีอยู่ในเวอร์ชันคงที่เท่านั้นมันจะใช้โดยไม่มี-Wl,-Bstaticแต่ฉันต้องการบอกเป็นนัยว่าgccชอบไลบรารีแบบคงที่ ฉันรู้ด้วยว่าการระบุไฟล์ไลบรารีโดยตรงจะเชื่อมโยงกับมัน แต่ฉันชอบที่จะให้ความหมายรวมถึงไลบรารีแบบคงที่และไดนามิกเหมือนกัน

20
ข้อผิดพลาด LNK2038: ตรวจพบไม่ตรงกันสำหรับ '_ITERATOR_DEBUG_LEVEL': ค่า '0' ไม่ตรงกับค่า '2' ใน main.obj
ฉันได้อ่านวิธีแก้ปัญหามากมาย แต่ไม่มีใครช่วยได้ ฉันพยายามทำความสะอาดสร้างใหม่ ติดตั้งวิชวล 2010 ใหม่และเปลี่ยนจากมืออาชีพเป็นสุดยอด แต่ฉันก็ยังไม่รู้ว่าทำไมฉันถึงมีข้อผิดพลาดนี้ โครงการของฉันมีลักษณะดังนี้: 1 Exe Solution เพื่อทดสอบไลบรารีแบบคงที่ของฉัน 1 ห้องสมุดแบบคงที่โซลูชัน Dll รหัสที่แปลงเป็น dll ใช้ฟังก์ชันจาก 1 lib เรียกว่า ClassificationFramework ฉันให้ lib นี้เป็นส่วนหัวและ cpp โดยทั่วไปซอร์สโค้ด ในโซลูชัน Exe ฉันเชื่อมโยงไลบรารีที่สร้างขึ้นของฉัน + libs อื่น ๆ เพื่อเรียกใช้ + ClassificationFramework.dll ทุกอย่างทำงานได้ดีเมื่อฉันใช้ Release แต่เมื่อฉันเปลี่ยนเป็น Debug (เพราะฉันต้องการแก้จุดบกพร่องบางอย่างฉันเบื่อที่จะข้ามดีบักเกอร์ในโหมดรีลีส) ฉันได้รับสิ่งนี้: 2>Link: 2> ClassificationFramework.lib(SampleClass.obj) : MSIL .netmodule or …
131 c++  debugging  linker 

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