การใช้ไลบรารีภายนอกใน D

ฉันมีชุด DMD + Tango บน linux โปรดให้ข้อมูลทีละขั้นตอนแก่ฉัน ฉันจะใช้ไลบรารีภายนอกใน D เช่น zlib ได้อย่างไร ฉันได้รวบรวม zlib แล้ว

ฉันมีแผนผังไฟล์เช่นนี้:

myzlib
├── include
│   ├── zconf.h
│   └── zlib.h
└── lib
    └── libz.a

ฉันได้รับสาย import tango.io.compress.ZlibStream; ในแหล่งที่มา myfile.d ของฉัน

และนี่คือคำถามของฉัน:

  1. ฉันจำเป็นต้องคัดลอกไฟล์เหล่านี้ไปยังไดเร็กทอรี dmd/lib หรือไม่
  2. ฉันจำเป็นต้องแก้ไขไฟล์ dmd/bin/dmd.conf หรือไม่
  3. ฉันจะเรียก dmd คอมไพเลอร์ (dmd myfile.d -Llibz.a) หรืออย่างอื่น (อาจมีเส้นทางที่แน่นอน) ได้อย่างไร

ฉันไม่เคยลองใช้ไลบรารีภายนอกในภาษาอื่นใดเลย โปรดช่วยฉันด้วย


person Sigillum Diaboli    schedule 20.02.2011    source แหล่งที่มา


คำตอบ (2)


แฟล็ก -L บอกให้ลิงก์เกอร์เพิ่มไดเร็กทอรีเฉพาะลงในพาธการค้นหา

-l บอกให้ลิงก์ในไลบรารีใดไลบรารีหนึ่ง และมันจะค้นหาเส้นทางการค้นหาเพื่อค้นหาไลบรารีนั้น

ด้วย DMD คุณจะต้องส่งแฟล็กไปยังตัวลิงก์ด้วยแฟล็ก -L สามารถใช้เส้นทางแบบสัมบูรณ์หรือแบบสัมพัทธ์ก็ได้ แต่เส้นทางจะต้องสัมพันธ์กับตำแหน่งที่เรียกใช้คอมไพเลอร์ ดังนั้น หากคุณใช้พาธแบบสัมพัทธ์ คุณจะต้องรันคอมไพลเลอร์จากไดเร็กทอรีเดียวกัน (ซึ่งโดยทั่วไปแล้วไม่ใช่ปัญหา เนื่องจากโดยทั่วไปแล้วคุณจะมีคำสั่ง build ใน Makefile ซึ่งคุณจะรันจากไดเร็กทอรีเดียวกันเสมอ) ไดเร็กทอรี).

สิ่งที่พบบ่อยที่สุดคือการใช้เส้นทางสัมบูรณ์สำหรับไลบรารีที่ติดตั้งบนระบบและเส้นทางสัมพัทธ์สำหรับไลบรารีเฉพาะสำหรับโปรเจ็กต์ของคุณ

ดังนั้น หากคุณมีห้องสมุด myzlib/lib/libz.a คุณจะผ่าน -L-Lmyzlib/lib -L-lz ถึง dmd

จากนั้นมันจะเพิ่ม myzlib/lib ลงในพาธการค้นหาของตัวเชื่อมโยง จากนั้นมองหา libz.a ในพาธการค้นหา (ตัวเชื่อมโยงรู้ว่าจะต้องใช้ส่วนที่ตามหลัง -l เพิ่ม lib ที่ด้านหน้าของมัน และเพิ่ม .a ต่อท้ายเพื่อรับ ห้องสมุดที่คุณกำลังมองหา)

คุณสามารถเพิ่มแฟล็กลิงก์เกอร์ไปที่ dmd.conf แต่ฉันไม่แนะนำจริงๆ แฟล็กใน dmd.conf คือสิ่งที่ dmd เสมอ ใช้สำหรับ ทุก โปรแกรม ดังนั้น คุณควรมีเฉพาะแฟล็กที่ใช้ในโปรแกรมทั้งหมดเท่านั้น

แต่ให้ป้อนพวกมันไปที่ dmd โดยตรง (ไม่ว่าจะเป็นบนบรรทัดคำสั่งหรือเป็นส่วนหนึ่งของ Makefile)

สำหรับไฟล์ส่วนหัว คุณจะต้องทำซ้ำการประกาศใดๆ ที่คุณต้องการในไฟล์ .d

ไฟล์ส่วนหัวถูกใช้โดยคอมไพเลอร์ C หรือ C++ ไม่ใช่ตัวเชื่อมโยง D แชร์ลิงก์เกอร์เดียวกันกับที่คุณใช้สำหรับ C หรือ C++ แต่คอมไพเลอร์ของมันคือ dmd ไม่ใช่ gcc

ดังนั้น คุณต้องทำซ้ำการประกาศ C ในไฟล์ D วิธีที่ง่ายที่สุดในการดำเนินการดังกล่าวคือใช้ htod utility แต่ใช้งานได้เฉพาะใน Windows เท่านั้น หรือไวน์

ไม่ว่าคุณจะต้องประกาศการประกาศ C ที่คุณจะใช้ในไฟล์ .d และทำเครื่องหมายด้วย extern(C)

person Jonathan M Davis    schedule 20.02.2011

หากคุณตั้งค่าบิลด์ของคุณให้ทำขั้นตอนการคอมไพล์และลิงก์แยกกัน (เหมือนกับที่ทำกับ c เป็นเรื่องปกติ) โดยพื้นฐานแล้วจะเหมือนกับการทำเช่นเดียวกันกับ C ขั้นแรก ให้บิลด์ของคุณทำงานโดยไม่มี lib พิเศษ (เพื่อให้แน่ใจว่า คุณกำลังส่งแฟล็กที่จำเป็นทั้งหมดไปยังตัวเชื่อมโยง) จากนั้นเพิ่ม libs ตามปกติ หากต้องการใช้ไลบรารี C จาก D ต้องใช้ไฟล์การโยง ซึ่งมีประสิทธิภาพเพียงไฟล์ D ที่ประกอบด้วยต้นแบบเท่านั้น

person BCS    schedule 20.02.2011