Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Panduan langkah demi langkah ini menjelaskan cara menggunakan Visual Studio IDE untuk membuat pustaka tautan dinamis (DLL) Anda sendiri yang ditulis di Microsoft C++ (MSVC), dan cara menggunakan DLL dari aplikasi C++ lain. DLL, juga dikenal sebagai pustaka bersama dalam sistem operasi berbasis UNIX, adalah salah satu jenis komponen Windows yang paling berguna. Anda dapat menggunakannya untuk berbagi kode dan sumber daya, dan untuk menyusutkan ukuran aplikasi Anda. DLL bahkan dapat mempermudah layanan dan memperluas aplikasi Anda.
Dalam panduan ini, Anda membuat DLL yang mengimplementasikan beberapa fungsi matematika. Kemudian Anda membuat aplikasi konsol yang menggunakan fungsi dari DLL. Anda juga mendapatkan pengantar beberapa teknik dan konvensi pemrograman yang digunakan di DLL Windows.
Panduan ini mencakup langkah-langkah berikut:
- Buat proyek DLL di Visual Studio.
- Tambahkan fungsi dan variabel yang diekspor ke DLL.
- Buat proyek aplikasi konsol di Visual Studio.
- Gunakan fungsi dan variabel yang diimpor dari DLL di aplikasi konsol.
- Jalankan aplikasi yang telah selesai.
Seperti pustaka yang ditautkan secara statis, DLL mengekspor variabel, fungsi, dan sumber daya berdasarkan nama. Aplikasi klien mengimpor nama untuk menggunakan variabel, fungsi, dan sumber daya tersebut. Tidak seperti pustaka yang ditautkan secara statis, Windows menyambungkan impor di aplikasi Anda ke ekspor dalam DLL pada waktu pemuatan atau pada waktu proses, alih-alih menyambungkannya pada waktu tautan. Windows memerlukan informasi tambahan yang bukan bagian dari model kompilasi C++ standar untuk membuat koneksi ini. Pengkompilasi MSVC mengimplementasikan beberapa ekstensi khusus Microsoft ke C++ untuk memberikan informasi tambahan ini. Panduan ini menjelaskan ekstensi-ekstensi tersebut seiring Anda mengikutinya.
Panduan ini membuat dua solusi Visual Studio: yang membangun DLL, dan yang membangun aplikasi klien. DLL menggunakan konvensi panggilan C. Ini dapat dipanggil dari aplikasi yang ditulis dalam bahasa pemrograman lain, asalkan platform, konvensi pemanggilan, dan konvensi penautan sesuai. Aplikasi klien menggunakan penautan implisit, di mana Windows menautkan aplikasi ke DLL pada waktu pemuatan. Penautan ini memungkinkan aplikasi memanggil fungsi yang disediakan DLL seperti fungsi dalam pustaka yang ditautkan secara statis.
Panduan ini tidak mencakup beberapa situasi umum. Kode tidak menunjukkan penggunaan DLL C++ oleh bahasa pemrograman lainnya. Ini tidak menunjukkan cara membuat DLL khusus sumber daya, atau cara menggunakan penautan eksplisit untuk memuat DLL pada waktu proses daripada pada waktu pemuatan. Yakinlah, Anda dapat menggunakan MSVC dan Visual Studio untuk melakukan semua hal ini.
Meskipun kode DLL ditulis dalam C++, gunakan antarmuka gaya C untuk fungsi yang diekspor. Ada dua alasan utama untuk pilihan ini: Pertama, banyak bahasa lain mendukung impor fungsi gaya C. Aplikasi klien tidak harus ditulis dalam C++. Kedua, ini menghindari beberapa perangkap umum yang terkait dengan kelas yang diekspor dan fungsi anggota. Mudah sekali membuat kesalahan yang sulit didiagnosis saat mengekspor kelas, karena segala sesuatu yang disebutkan dalam deklarasi kelas harus memiliki instansiasi yang juga diekspor. Pembatasan ini berlaku untuk DLL, tetapi bukan pustaka statis. Jika kelas Anda bergaya data sederhana, Anda seharusnya tidak mengalami masalah ini.
Untuk tautan ke informasi selengkapnya tentang DLL, lihat Membuat DLL C/C++ di Visual Studio. Untuk informasi selengkapnya tentang penautan implisit dan penautan eksplisit, lihat Menentukan metode penautan mana yang akan digunakan. Untuk informasi tentang membuat DLL C++ untuk digunakan dengan bahasa pemrograman yang menggunakan konvensi tautan bahasa C, lihat Mengekspor fungsi C++ untuk digunakan dalam executable bahasa C. Untuk informasi tentang cara membuat DLL untuk digunakan dengan bahasa .NET, lihat Memanggil Fungsi DLL dari Aplikasi Visual Basic.
Prasyarat
- Windows 7 atau yang lebih baru. Untuk pengalaman pengembangan terbaik, gunakan versi terbaru Windows.
Studio Visual. Untuk mempelajari cara mengunduh dan menginstal Visual Studio, lihat Menginstal Visual Studio. Saat Anda menjalankan alat penginstal, pastikan bahwa beban kerja Pengembangan Desktop dengan C++ dicentang. Jika Anda tidak menginstal beban kerja ini saat menginstal Visual Studio, jangan khawatir. Anda dapat menjalankan alat penginstal lagi dan menginstalnya sekarang.
- Studio Visual. Untuk informasi tentang cara mengunduh dan menginstal Visual Studio 2015, lihat Menginstal Visual Studio 2015. Gunakan penginstalan Kustom untuk menginstal pengkompilasi dan alat C++, karena tidak diinstal secara default.
Pemahaman tentang dasar-dasar penggunaan Lingkungan Pengembangan Terpadu (IDE) Visual Studio. Jika Anda pernah menggunakan aplikasi desktop Windows sebelumnya, Anda mungkin bisa mengikutinya. Untuk pengenalan, lihat panduan fitur Visual Studio IDE.
Beberapa keakraban dengan bahasa C++. Jangan khawatir, panduan tidak mencakup sesuatu yang terlalu rumit.
Nota
Panduan ini mengasumsikan Anda menggunakan Visual Studio 2017 versi 15.9 atau yang lebih baru. Beberapa versi Visual Studio 2017 yang lebih lama memiliki cacat dalam templat kode, atau menggunakan dialog antarmuka pengguna yang berbeda. Untuk menghindari masalah, gunakan Penginstal Visual Studio untuk memperbarui Visual Studio 2017 ke versi 15.9 atau yang lebih baru.
Membuat proyek DLL
Dalam kumpulan tugas berikut, Anda membuat proyek untuk DLL Anda, menambahkan kode, dan membangunnya. Untuk memulai, jalankan Visual Studio IDE, dan masuk jika perlu. Instruksinya sedikit bervariasi tergantung pada versi Visual Studio mana yang Anda gunakan. Untuk melihat langkah-langkah untuk versi Visual Studio pilihan Anda, gunakan pemilih Versi yang terletak di bagian atas daftar isi di halaman ini.
Untuk membuat proyek DLL di Visual Studio
Pada bilah menu, pilih File>Baru>Project untuk membuka dialog Buat Project Baru.
Di bagian atas dialog, atur Bahasa ke C++, atur Platform ke Windows, dan atur Jenis proyek ke Pustaka.
Dari daftar jenis proyek yang difilter, pilih Pustaka Tautan Dinamis (DLL), lalu pilih Berikutnya.
Jika Anda tidak melihat jenis tersebut, pastikan Anda memiliki pengembangan Desktop dengan C++ yang terinstal, seperti yang dijelaskan dalam prasyarat.
Di halaman Konfigurasikan proyek baru Anda , masukkan MathLibrary di kotak Nama proyek untuk menentukan nama proyek. Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Hapus centang Tempatkan solusi dan proyek di direktori yang sama jika dicentang.
Pilih tombol Buat untuk membuat proyek.
Saat solusi dibuat, Anda dapat melihat file proyek dan sumber yang dihasilkan di jendela Penjelajah Solusi di Visual Studio.
Untuk membuat proyek DLL di Visual Studio 2017
Pada bilah menu, pilih File>Baru>Project untuk membuka dialog Project Baru.
Di panel kiri dialog Proyek Baru, pilih Terinstal>Visual C++>Desktop Windows. Di panel tengah, pilih Dynamic-Link Library (DLL). Masukkan MathLibrary dalam kotak Nama untuk menentukan nama proyek. Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika belum dicentang.
Pilih tombol OK untuk membuat proyek.
Saat solusi dibuat, Anda dapat melihat file proyek dan sumber yang dihasilkan di jendela Penjelajah Solusi di Visual Studio.
Untuk membuat proyek DLL di Visual Studio 2015 dan versi yang lebih lama
Pada bilah menu, pilih File >Baru>Proyek.
Di panel kiri dialog Project Baru, perluasTemplat terinstal>, dan pilih Visual C++. Di panel tengah, pilih Aplikasi Konsol Win32. Masukkan MathLibrary sebagai Nama untuk proyek. Jangan ubah nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Pilih Buat direktori untuk solusi.
Pilih OK untuk menutup dialog Project Baru dan memulai Panduan Aplikasi Win32.
Pilih Selanjutnya. Pada halaman Pengaturan Aplikasi , di bawah Jenis aplikasi, pilih DLL.
Pilih Selesai untuk membuat proyek.
Saat wizard menyelesaikan solusi, Anda dapat melihat file proyek dan sumber yang dihasilkan di jendela Penjelajah Solusi di Visual Studio.
Saat ini, DLL ini tidak melakukan banyak hal. Selanjutnya, Anda akan membuat file header untuk mendeklarasikan fungsi yang diekspor DLL Anda, lalu menambahkan definisi fungsi ke DLL untuk membuatnya lebih berguna.
Untuk menambahkan file header ke DLL
Untuk membuat file header untuk fungsi Anda, pada bilah menu, pilih Project>Tambahkan Item Baru.
Dalam dialog Tambahkan Item Baru , di panel kiri, pilih Visual C++. Di panel tengah, pilih File Header (.h). Tentukan
MathLibrary.hsebagai nama untuk file header.
Pilih tombol Tambahkan untuk menghasilkan file header kosong, yang ditampilkan di jendela editor baru.
Ganti isi file header dengan kode ini:
// MathLibrary.h - Contains declarations of math functions #pragma once #ifdef MATHLIBRARY_EXPORTS #define MATHLIBRARY_API __declspec(dllexport) #else #define MATHLIBRARY_API __declspec(dllimport) #endif // The Fibonacci recurrence relation describes a sequence F // where F(n) is { n = 0, a // { n = 1, b // { n > 1, F(n-2) + F(n-1) // for some initial integral values a and b. // If the sequence is initialized F(0) = 1, F(1) = 1, // then this relation produces the well-known Fibonacci // sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. extern "C" MATHLIBRARY_API void fibonacci_init( const unsigned long long a, const unsigned long long b); // Produce the next value in the sequence. // Returns true on success and updates current value and index; // false on overflow, leaves current value and index unchanged. extern "C" MATHLIBRARY_API bool fibonacci_next(); // Get the current value in the sequence. extern "C" MATHLIBRARY_API unsigned long long fibonacci_current(); // Get the position of the current value in the sequence. extern "C" MATHLIBRARY_API unsigned fibonacci_index();
File header ini mendeklarasikan beberapa fungsi untuk menghasilkan urutan Fibonacci umum, mengingat dua nilai awal. Panggilan untuk fibonacci_init(1, 1) menghasilkan urutan nomor Fibonacci yang akrab.
Perhatikan pernyataan prapemroscessor di bagian atas file. Templat proyek baru untuk proyek DLL menambahkan <PROJECTNAME>_EXPORTS ke dalam makro praprosesor yang ditentukan. Dalam contoh ini, Visual Studio menentukan MATHLIBRARY_EXPORTS kapan proyek MAthLibrary DLL Anda dibangun.
Saat makro MATHLIBRARY_EXPORTS ditentukan, makro MATHLIBRARY_API mengatur pengubah __declspec(dllexport) pada deklarasi fungsi. Pengubah ini memberi tahu pengkompilasi dan linker untuk mengekspor fungsi atau variabel dari DLL untuk digunakan oleh aplikasi lain. Ketika MATHLIBRARY_EXPORTS tidak terdefinisi, misalnya, ketika file header disertakan oleh aplikasi klien, MATHLIBRARY_API menerapkan __declspec(dllimport) pengubah ke deklarasi. Pengubah ini mengoptimalkan impor fungsi atau variabel dalam aplikasi. Untuk informasi selengkapnya, lihat dllexport, dllimport.
Untuk menambahkan implementasi ke DLL
Di Penjelajah Solusi, klik kanan simpul File Sumber dan pilih Tambahkan>Item Baru. Buat file baru
.cppbernamaMathLibrary.cpp, sama seperti Anda menambahkan file header baru di langkah sebelumnya.Di jendela editor, pilih tab
MathLibrary.cppjika sudah terbuka. Jika tidak, di Penjelajah Solusi, klikMathLibrary.cppdua kali di folder File Sumber dari proyek MathLibrary untuk membukanya.Di editor, ganti konten
MathLibrary.cppfile dengan kode berikut:// MathLibrary.cpp : Defines the exported functions for the DLL. #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include <utility> #include <limits.h> #include "MathLibrary.h" // DLL internal state variables: static unsigned long long previous_; // Previous value, if any static unsigned long long current_; // Current sequence value static unsigned index_; // Current seq. position // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. void fibonacci_init( const unsigned long long a, const unsigned long long b) { index_ = 0; current_ = a; previous_ = b; // see special case when initialized } // Produce the next value in the sequence. // Returns true on success, false on overflow. bool fibonacci_next() { // check to see if we'd overflow result or position if ((ULLONG_MAX - previous_ < current_) || (UINT_MAX == index_)) { return false; } // Special case when index == 0, just return b value if (index_ > 0) { // otherwise, calculate next sequence value previous_ += current_; } std::swap(current_, previous_); ++index_; return true; } // Get the current value in the sequence. unsigned long long fibonacci_current() { return current_; } // Get the current index position in the sequence. unsigned fibonacci_index() { return index_; }
Di jendela editor, pilih tab untuk MathLibrary.cpp jika sudah terbuka. Jika tidak, di Penjelajah Solusi, klik dua kali MathLibrary.cpp di folder File Sumber proyek MathLibrary untuk membukanya.
Di editor, ganti konten
MathLibrary.cppfile dengan kode berikut:// MathLibrary.cpp : Defines the exported functions for the DLL. #include "stdafx.h" // use pch.h in Visual Studio 2019 and later #include <utility> #include <limits.h> #include "MathLibrary.h" // DLL internal state variables: static unsigned long long previous_; // Previous value, if any static unsigned long long current_; // Current sequence value static unsigned index_; // Current seq. position // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. void fibonacci_init( const unsigned long long a, const unsigned long long b) { index_ = 0; current_ = a; previous_ = b; // see special case when initialized } // Produce the next value in the sequence. // Returns true on success, false on overflow. bool fibonacci_next() { // check to see if we'd overflow result or position if ((ULLONG_MAX - previous_ < current_) || (UINT_MAX == index_)) { return false; } // Special case when index == 0, just return b value if (index_ > 0) { // otherwise, calculate next sequence value previous_ += current_; } std::swap(current_, previous_); ++index_; return true; } // Get the current value in the sequence. unsigned long long fibonacci_current() { return current_; } // Get the current index position in the sequence. unsigned fibonacci_index() { return index_; }
Untuk memverifikasi bahwa semuanya berfungsi sejauh ini, kompilasi DLL. Untuk mengkompilasi, pilih Build>Build Solution pada bilah menu. DLL dan output pengkompilasi terkait ditempatkan dalam folder yang disebut Debug tepat di bawah folder solusi. Jika Anda membuat build Rilis, output ditempatkan di folder bernama Release. Output akan terlihat seperti ini:
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>pch.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>stdafx.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>MathLibrary.cpp
1>dllmain.cpp
1>Generating Code...
1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.pdb (Partial PDB)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Selamat, Anda membuat DLL dengan menggunakan Visual Studio! Selanjutnya, Anda membuat aplikasi klien yang menggunakan fungsi yang diekspor DLL.
Membuat aplikasi klien yang menggunakan DLL
Saat Anda membuat DLL, pikirkan tentang bagaimana aplikasi klien mungkin menggunakannya. Untuk memanggil fungsi atau mengakses data yang diekspor oleh DLL, kode sumber klien harus memiliki deklarasi yang tersedia pada waktu kompilasi. Pada saat pengaitan, linker memerlukan informasi untuk memecahkan panggilan fungsi atau akses data. DLL menyediakan informasi ini di pustaka impor, file yang berisi informasi tentang cara menemukan fungsi dan data, bukan kode aktual. Dan pada waktu proses, DLL harus tersedia untuk klien, di lokasi yang dapat ditemukan sistem operasi.
Baik itu milik Anda sendiri atau dari pihak ketiga, proyek aplikasi klien Anda memerlukan beberapa informasi untuk menggunakan DLL. Ini perlu menemukan header yang mendeklarasikan ekspor DLL, pustaka impor untuk linker, dan DLL itu sendiri. Salah satu solusinya adalah menyalin semua file ini ke dalam proyek klien Anda. Untuk DLL pihak ketiga yang tidak mungkin berubah saat klien Anda sedang dalam pengembangan, metode ini mungkin merupakan cara terbaik untuk menggunakannya. Namun, ketika Anda juga membangun DLL, lebih baik menghindari duplikasi. Jika Anda membuat salinan lokal file DLL yang sedang dikembangkan, Anda mungkin secara tidak sengaja mengubah file header dalam satu salinan tetapi tidak yang lain, atau menggunakan pustaka kedaluarsa.
Untuk menghindari kode yang tidak sinkron, atur jalur penyertaan dalam proyek klien Anda agar langsung mengacu pada file header DLL dari proyek DLL Anda. Selain itu, atur jalur pustaka di proyek klien Anda untuk menyertakan pustaka impor DLL dari proyek DLL. Terakhir, salin DLL bawaan dari proyek DLL ke direktori output build klien Anda. Langkah ini memungkinkan aplikasi klien Anda untuk menggunakan kode DLL yang sama dengan yang Anda buat.
Untuk membuat aplikasi klien di Visual Studio
Pada bilah menu, pilih File>Baru>Project untuk membuka dialog Buat project baru.
Di bagian atas dialog, atur Bahasa ke C++, atur Platform ke Windows, dan atur jenis Project ke Konsol.
Dari daftar jenis proyek yang difilter, pilih Aplikasi Konsol lalu pilih Berikutnya.
Di halaman Konfigurasikan proyek baru Anda , masukkan MathClient di kotak Nama proyek untuk menentukan nama proyek. Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Hapus centang Tempatkan solusi dan proyek di direktori yang sama jika dicentang.
Pilih tombol Buat untuk membuat proyek klien.
Proyek aplikasi konsol minimal dibuat untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, itu bernama MathClient.cpp. Anda dapat membuatnya, tetapi belum menggunakan DLL Anda.
Untuk membuat aplikasi klien di Visual Studio 2017
Untuk membuat aplikasi C++ yang menggunakan DLL yang Anda buat, pada bilah menu, pilih File>Baru>Project.
Pada panel kiri dialog Proyek Baru, pilih Windows Desktop di bawah Terinstal> Visual C++. Di panel tengah, pilih Aplikasi Konsol Windows. Masukkan MathClient di kotak Nama . Pertahankan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika belum dicentang.
Pilih OK untuk membuat proyek aplikasi klien.
Proyek aplikasi konsol minimal dibuat untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, itu bernama MathClient.cpp. Anda dapat membuatnya, tetapi belum menggunakan DLL Anda.
Untuk membuat aplikasi klien di Visual Studio 2015
Untuk membuat aplikasi C++ yang menggunakan DLL yang Anda buat, pada bilah menu, pilih File>Baru>Project.
Di panel kiri dialog Proyek Baru, pilih Win32 di bawahTemplat>>Visual C++. Di panel tengah, pilih Aplikasi Konsol Win32. Tentukan nama untuk proyek, MathClient, dalam kotak Edit nama . Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika belum dicentang.
Pilih tombol OK untuk menutup dialog Project Baru dan memulai Panduan Aplikasi Win32. Pada halaman Gambaran Umum dialog Panduan Aplikasi Win32 , pilih tombol Berikutnya .
Pada halaman Pengaturan Aplikasi , di bawah Jenis aplikasi, pilih Aplikasi konsol jika belum dipilih.
Pilih Selesai untuk membuat proyek.
Setelah wizard selesai, proyek aplikasi konsol sederhana akan dibuat untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, itu bernama MathClient.cpp. Anda dapat membuatnya, tetapi belum menggunakan DLL Anda.
Selanjutnya, untuk memanggil fungsi MathLibrary dalam kode sumber Anda, proyek Anda harus menyertakan MathLibrary.h file . Anda dapat menyalin file header ini ke proyek aplikasi klien Anda, lalu menambahkannya ke proyek sebagai item yang sudah ada. Metode ini bisa menjadi pilihan yang baik untuk pustaka pihak ketiga. Namun, jika Anda mengerjakan kode untuk DLL dan klien Anda secara bersamaan, file header bisa tidak sinkron. Untuk menghindari masalah ini, atur jalur Sertakan Direktori Tambahan di proyek Anda untuk menyertakan jalur ke header asli.
Untuk menambahkan header DLL ke jalur sertakan Anda
Klik kanan simpul MathClient di Penjelajah Solusi untuk membuka dialog Halaman Properti.
Dalam kotak dropdown Konfigurasi , pilih Semua Konfigurasi jika belum dipilih.
Di panel kiri, pilih Properti> KonfigurasiC/C++>Umum.
Di panel properti, pilih kontrol dropdown di samping kotak edit Sertakan Direktori Tambahan , lalu pilih Edit.
Klik ganda di panel atas dialog Sertakan Direktori Tambahan untuk mengaktifkan kontrol edit. Atau, pilih ikon folder untuk membuat entri baru.
Dalam kontrol edit, tentukan jalur ke lokasi
MathLibrary.hfile header. Anda dapat memilih kontrol elipsis (...) untuk menelusuri ke folder yang benar.Anda juga dapat memasukkan jalur relatif dari file sumber klien Anda ke folder yang berisi file header DLL. Jika Anda mengikuti petunjuk untuk menempatkan proyek klien Anda dalam solusi terpisah dari DLL, jalur relatif akan terlihat seperti ini:
..\..\MathLibrary\MathLibraryJika DLL dan proyek klien Anda berada dalam solusi yang sama, jalur relatif mungkin terlihat seperti ini:
..\MathLibraryKetika DLL dan proyek klien berada di folder lain, sesuaikan jalur relatif agar cocok. Atau, gunakan kontrol elipsis untuk menelusuri folder.
Setelah Anda memasukkan jalur ke file header dalam dialog Sertakan Direktori Tambahan , pilih OK. Dalam dialog Halaman Properti , pilih OK untuk menyimpan perubahan Anda.
Anda sekarang dapat menyertakan MathLibrary.h file dan menggunakan fungsi yang dinyatakannya dalam aplikasi klien Anda. Ganti konten MathClient.cpp dengan menggunakan kode ini:
// MathClient.cpp : Client app for MathLibrary DLL.
// #include "pch.h" Uncomment for Visual Studio 2017 and earlier
#include <iostream>
#include "MathLibrary.h"
int main()
{
// Initialize a Fibonacci relation sequence.
fibonacci_init(1, 1);
// Write out the sequence values until overflow.
do {
std::cout << fibonacci_index() << ": "
<< fibonacci_current() << std::endl;
} while (fibonacci_next());
// Report count of values written before overflow.
std::cout << fibonacci_index() + 1 <<
" Fibonacci sequence values fit in an " <<
"unsigned 64-bit integer." << std::endl;
}
Kode ini dapat dikompilasi, tetapi tidak ditautkan. Jika Anda membuat aplikasi klien sekarang, daftar kesalahan menampilkan beberapa kesalahan LNK2019. Itu karena proyek Anda masih kekurangan beberapa informasi: Anda belum menyatakan bahwa proyek Anda bergantung pada pustaka MathLibrary.lib. Dan, Anda tidak memberi tahu linker cara menemukan MathLibrary.lib file.
Untuk memperbaiki masalah ini, Anda dapat menyalin file pustaka langsung ke proyek aplikasi klien Anda. Linker akan menemukan dan menggunakannya secara otomatis. Namun, jika pustaka dan aplikasi klien sedang dikembangkan, tindakan tersebut mungkin menyebabkan perubahan dalam satu salinan yang tidak ditampilkan di salinan lainnya. Untuk menghindari masalah ini, atur properti Dependensi Tambahan untuk memberi tahu sistem build bahwa proyek Anda bergantung pada MathLibrary.lib. Dan, atur jalur Direktori Pustaka Tambahan dalam proyek Anda untuk menyertakan jalur ke pustaka asli saat Anda menautkan.
Untuk menambahkan pustaka import DLL ke dalam proyek Anda
Klik kanan simpul MathClient di Penjelajah Solusi dan pilih Properti untuk membuka dialog Halaman Properti.
Dalam kotak dropdown Konfigurasi , pilih Semua Konfigurasi jika belum dipilih. Pilihan ini memastikan bahwa setiap perubahan properti berlaku untuk build Debug dan Rilis.
Di panel kiri, pilih Properti Konfigurasi>Penghubung>Input. Di panel properti, pilih kontrol dropdown di samping kotak edit Dependensi Tambahan , lalu pilih Edit.
Dalam dialog Dependensi Tambahan , tambahkan
MathLibrary.libke daftar di kontrol edit teratas.
Pilih OK untuk kembali ke dialog Halaman Properti .
Di panel kiri, pilih Properti> KonfigurasiLinker>Umum. Di panel properti, pilih kontrol dropdown di samping kotak edit Direktori Pustaka Tambahan , lalu pilih Edit.
Klik ganda di panel atas dialog Direktori Pustaka Tambahan untuk mengaktifkan kontrol edit. Di kontrol edit, tentukan jalur ke lokasi
MathLibrary.libfile. Secara default, folder tersebut berada di folder bernama Debug langsung di bawah folder solusi DLL. Jika Anda membuat build rilis, file ditempatkan di folder bernama Rilis. Anda dapat menggunakan$(IntDir)makro sehingga linker dapat menemukan DLL Anda, apa pun jenis build yang Anda buat. Jika Anda mengikuti petunjuk untuk menempatkan proyek klien Anda dalam solusi terpisah dari proyek DLL, jalur relatif akan terlihat seperti ini:..\..\MathLibrary\$(IntDir)Jika DLL dan proyek klien Anda berada di lokasi lain, sesuaikan jalur relatif agar sesuai.
Setelah Anda memasukkan jalur ke file pustaka dalam dialog Direktori Pustaka Tambahan , pilih OK untuk kembali ke dialog Halaman Properti . Pilih OK untuk menyimpan perubahan properti.
Aplikasi klien Anda sekarang dapat mengkompilasi dan menautkan dengan sukses, tetapi masih tidak memiliki semua yang diperlukan untuk dijalankan. Saat sistem operasi memuat aplikasi Anda, sistem operasi mencari DLL MathLibrary. Jika tidak dapat menemukan DLL di direktori sistem tertentu, jalur lingkungan, atau direktori aplikasi lokal, beban gagal. Bergantung pada sistem operasi, Anda akan melihat pesan kesalahan seperti ini:
Salah satu cara untuk menghindari masalah ini adalah dengan menyalin DLL ke direktori yang berisi klien Anda yang dapat dieksekusi sebagai bagian dari proses build. Anda dapat menambahkan peristiwa pasca-build ke proyek Anda, untuk menambahkan perintah yang menyalin DLL ke direktori output build Anda. Perintah yang Anda tentukan di sini menyalin DLL hanya jika hilang atau diubah. Ini menggunakan makro untuk menyalin ke dan dari lokasi Debug atau Rilis, berdasarkan konfigurasi build Anda.
Untuk menyalin DLL dalam tahap setelah membangun
Klik kanan simpul MathClient di Penjelajah Solusi dan pilih Properti untuk membuka dialog Halaman Properti.
Dalam kotak dropdown Konfigurasi , pilih Semua Konfigurasi jika belum dipilih.
Di panel kiri, pilih Properti Konfigurasi>Event Build>Event Pasca-Build.
Di panel properti, pilih kontrol pengeditan pada bidang Baris Perintah . Jika Anda mengikuti petunjuk untuk menempatkan proyek klien Anda dalam solusi terpisah dari proyek DLL, masukkan perintah ini:
xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"Jika DLL dan proyek klien Anda berada di direktori lain, ubah jalur relatif ke DLL agar cocok.
Pilih OK untuk menyimpan perubahan Anda ke properti proyek.
Aplikasi klien Anda sekarang memiliki semua yang diperlukan untuk membangun dan menjalankan. Buat aplikasi dengan memilih Build>Build Solution pada bilah menu. Jendela Output di Visual Studio memperlihatkan sesuatu seperti contoh berikut tergantung pada versi Visual Studio Anda:
1>------ Build started: Project: MathClient, Configuration: Debug Win32 ------
1>MathClient.cpp
1>MathClient.vcxproj -> C:\Users\username\Source\Repos\MathClient\Debug\MathClient.exe
1>1 File(s) copied
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Anda membuat aplikasi yang memanggil fungsi di DLL Anda. Sekarang jalankan aplikasi Anda untuk melihat apa yang dilakukannya. Pada bilah menu, pilih Debug>Mulai Tanpa Debugging. Visual Studio membuka jendela perintah untuk menjalankan program. Bagian terakhir dari output terlihat seperti:
Tekan tombol apa pun untuk menutup jendela perintah.
Setelah membuat DLL dan aplikasi klien, Anda dapat bereksperimen. Coba atur titik henti dalam kode aplikasi klien, dan jalankan aplikasi di debugger. Lihat apa yang terjadi saat Anda masuk ke panggilan pustaka. Tambahkan fungsi lain ke pustaka, atau tulis aplikasi klien lain yang menggunakan DLL Anda.
Saat menyebarkan aplikasi, Anda juga harus menyebarkan DLL yang digunakannya. Cara paling sederhana untuk membuat DLL yang Anda buat, atau yang Anda sertakan dari pihak ketiga, tersedia adalah dengan menempatkannya di direktori yang sama dengan aplikasi Anda. Pendekatan ini dikenal sebagai penyebaran lokal aplikasi. Untuk informasi selengkapnya tentang penyebaran, lihat Penyebaran di Microsoft C++.