it-swarm-id.com

Menautkan dll di Visual Studio

Bagaimana saya bisa menambahkan .dll di Visual Studio 2010? Saya tidak dapat menemukan opsi di sana.

25
smallB

Pada Windows Anda tidak terhubung dengan file .dll secara langsung - Anda harus menggunakan file .lib yang menyertainya. Untuk melakukannya, buka Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies dan tambahkan path ke .lib Anda sebagai baris berikutnya. 

Anda juga harus memastikan bahwa file .dll ada di direktori yang terdapat oleh variabel lingkungan %PATH% atau bahwa salinannya ada di Output Directory (secara default, ini Debug\Release di bawah folder proyek Anda).

Jika Anda tidak memiliki akses ke file .lib, salah satu alternatifnya adalah memuat .dll secara manual selama runtime menggunakan fungsi WINAPI seperti LoadLibrary dan GetProcAddress .

43
gwiazdorrr

Anda tidak menambahkan atau menautkan secara langsung terhadap DLL, Anda menautkan terhadap LIB yang dihasilkan oleh DLL.

LIB memberikan simbol dan data lain yang diperlukan untuk memasukkan pustaka ke dalam kode Anda (penghubung statis) atau merujuk ke DLL (penghubung dinamis).

Untuk menghubungkan dengan LIB, Anda harus menambahkannya ke Properties proyek -> Linker -> Input -> daftar Ketergantungan Tambahan. Semua file LIB di sini akan digunakan untuk menghubungkan. Anda juga dapat menggunakan pragma seperti:

#pragma comment(lib, "dll.lib")

Dengan tautan statis, kode ini termasuk dalam executable Anda dan tidak ada dependensi runtime. Tautan dinamis memerlukan DLL dengan nama dan simbol yang cocok tersedia di jalur pencarian (yang bukan hanya jalur atau direktori sistem).

21
ssube

Saya merasa berguna untuk memahami alat yang mendasarinya. Ini adalah cl.exe (compiler) dan link.exe (linker). Anda perlu memberi tahu kompiler tanda tangan dari fungsi yang ingin Anda panggil di perpustakaan dinamis (dengan memasukkan header perpustakaan) dan Anda perlu memberi tahu tautan apa yang disebut perpustakaan dan bagaimana menyebutnya (dengan memasukkan "implib" atau impor perpustakaan).

Ini kira-kira sama dengan proses yang digunakan gcc untuk menautkan ke pustaka dinamis pada * nix, hanya file objek pustaka yang berbeda.

Mengetahui alat yang mendasarinya berarti Anda dapat lebih cepat menemukan pengaturan yang sesuai di IDE dan memungkinkan Anda untuk memeriksa apakah baris perintah yang dihasilkan sudah benar.

Contoh

Katakanlah A.exe tergantung B.dll. Anda harus memasukkan tajuk B di A.cpp (#include "B.h") lalu kompilasi dan tautkan dengan B.lib:

cl A.cpp /c /EHsc
link A.obj B.lib

Baris pertama menghasilkan A.obj, baris kedua menghasilkan A.exe. Bendera /c memberi tahu cl untuk tidak menautkan dan /EHsc menentukan jenis pengecualian C++ yang menangani biner yang harus digunakan (tidak ada default, jadi Anda harus menentukan sesuatu).

Jika Anda tidak menentukan /c, cl akan memanggil link untuk Anda. Anda dapat menggunakan flag /link untuk menentukan argumen tambahan ke link dan melakukannya sekaligus jika Anda suka:

cl A.cpp /EHsc /link B.lib

Jika B.lib tidak berada di jalur INCLUDE, Anda dapat memberikan path relatif atau absolut ke sana atau menambahkan direktori induknya ke path include Anda dengan flag /I.

Jika Anda menelepon dari cygwin (seperti yang saya lakukan) ganti garis miring dengan tanda hubung.

Jika Anda menulis #pragma comment(lib, "B.lib") dalam A.cpp Anda hanya memberi tahu kompiler untuk meninggalkan komentar di A.obj memberi tahu tautan untuk menautkan ke B.lib. Ini sama dengan menentukan B.lib pada baris perintah tautan.

2
cmc