Menggunakan perpustakaan eksternal di D

Saya memiliki bundel DMD + Tango di linux. Tolong beri saya informasi langkah demi langkah, bagaimana saya bisa menggunakan perpustakaan eksternal di D, misalnya zlib. Saya telah mengkompilasi zlib.

Saya memiliki pohon file seperti ini:

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

Saya mendapat panggilan import tango.io.compress.ZlibStream; di sumber myfile.d saya.

Dan inilah pertanyaan saya:

  1. Apakah saya perlu menyalin file-file ini ke direktori dmd/lib?
  2. Apakah saya perlu mengubah file dmd/bin/dmd.conf?
  3. Bagaimana cara memanggil dmd compiler (dmd myfile.d -Llibz.a) atau yang lainnya (mungkin, dengan jalur absolut)?

Saya belum pernah mencoba menggunakan perpustakaan eksternal dalam bahasa lain. Tolong bantu aku.


person Sigillum Diaboli    schedule 20.02.2011    source sumber


Jawaban (2)


Flag -L memberitahu linker untuk menambahkan direktori tertentu ke jalur pencariannya.

-l memerintahkannya untuk terhubung ke perpustakaan tertentu, dan ia mencari di jalur pencariannya untuk menemukan perpustakaan itu.

Dengan DMD, Anda harus meneruskan flag ke linker dengan flag -L. Ini dapat mengambil jalur absolut atau relatif, tetapi jalur tersebut harus relatif terhadap tempat kompiler dijalankan. Jadi jika Anda menggunakan jalur relatif, maka Anda harus selalu menjalankan kompiler dari direktori yang sama (yang umumnya tidak menjadi masalah, karena Anda biasanya memiliki perintah build di Makefile yang selalu Anda jalankan dari direktori yang sama direktori).

Hal yang paling umum adalah menggunakan jalur absolut untuk perpustakaan yang diinstal pada sistem dan jalur relatif untuk perpustakaan khusus untuk proyek Anda.

Jadi, jika Anda memiliki perpustakaan myzlib/lib/libz.a, Anda akan meneruskan -L-Lmyzlib/lib -L-lz ke dmd.

Ia kemudian akan menambahkan myzlib/lib ke jalur pencarian linker, dan kemudian mencari libz.a di jalur pencariannya (linker tahu untuk mengambil bagian setelah -l, tambahkan lib di depannya dan tambahkan akhiran .a di akhir untuk mendapatkan perpustakaan yang Anda cari).

Anda dapat menambahkan tanda linker ke dmd.conf, namun saya tidak menyarankannya. Flag di dmd.conf adalah yang selalu digunakan oleh dmd untuk setiap program. Jadi, Anda sebaiknya hanya memiliki flag yang digunakan di semua program Anda.

Sebaliknya, berikan mereka ke dmd secara langsung (baik itu di baris perintah atau sebagai bagian dari Makefile).

Sedangkan untuk file header, Anda perlu menduplikasi deklarasi apa pun yang Anda perlukan dalam file .d.

File header digunakan oleh kompiler C atau C++, bukan linker. D berbagi tautan yang sama seperti yang Anda gunakan untuk C atau C++, tetapi kompilernya adalah dmd, bukan gcc.

Jadi, Anda perlu menduplikasi deklarasi C dalam file D. Cara termudah untuk melakukannya adalah dengan htod utility, namun hanya berfungsi di Windows atau Anggur.

Apapun itu, Anda harus mendeklarasikan deklarasi C yang akan Anda gunakan dalam file .d dan menandainya dengan extern(C).

person Jonathan M Davis    schedule 20.02.2011

Jika Anda mengatur build Anda untuk melakukan langkah-langkah kompilasi dan penautan secara terpisah (seperti yang biasa dilakukan dengan c), pada dasarnya sama dengan melakukan hal yang sama dengan C. Pertama, buat build Anda berfungsi tanpa lib tambahan (untuk memastikan Anda meneruskan semua tanda yang diperlukan ke tautan) dan kemudian menambahkan lib seperti biasa. Untuk menggunakan perpustakaan C dari D memerlukan file pengikatan, mereka sebenarnya hanyalah file D yang hanya terdiri dari prototipe.

person BCS    schedule 20.02.2011