Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här stegvisa genomgången beskriver hur du använder Visual Studio IDE för att skapa ett eget DLL-bibliotek (Dynamic Link Library) som skrivits i Microsoft C++ (MSVC) och hur du använder DLL från en annan C++-app. DLL:er, även kallade delade bibliotek i UNIX-baserade operativsystem, är en av de mest användbara typerna av Windows-komponenter. Du kan använda dem för att dela kod och resurser och minska storleken på dina appar. DLL:er kan till och med göra det enklare att använda och utöka dina appar.
I den här genomgången skapar du en DLL som implementerar vissa matematiska funktioner. Sedan skapar du en konsolapp som använder funktionerna från DLL:en. Du får också en introduktion till några av de programmeringstekniker och konventioner som används i Windows DLL:er.
Den här genomgången beskriver följande steg:
- Skapa ett DLL-projekt i Visual Studio.
- Lägg till exporterade funktioner och variabler i DLL-filen.
- Skapa ett konsolappprojekt i Visual Studio.
- Använd de funktioner och variabler som importerats från DLL:en i konsolappen.
- Kör den färdiga appen.
Precis som ett statiskt länkat bibliotek exporterar en DLL variabler, funktioner och resurser efter namn. En klientapp importerar namnen för att använda dessa variabler, funktioner och resurser. Till skillnad från ett statiskt länkat bibliotek ansluter Windows importen i din app till exporten i en DLL vid inläsningstid eller vid körning, i stället för att ansluta dem vid länktid. Windows kräver extra information som inte ingår i C++-standardkompileringsmodellen för att upprätta dessa anslutningar. MSVC-kompilatorn implementerar vissa Microsoft-specifika tillägg till C++ för att tillhandahålla den här extra informationen. Vi förklarar dessa tillägg allt eftersom.
Den här genomgången skapar två Visual Studio-lösningar: en som skapar DLL och en som skapar klientappen. DLL använder C-anropskonventionen. Den kan anropas från appar som skrivits på andra programmeringsspråk, så länge plattformen, samtalskonventionerna och länkkonventionerna matchar. Klientappen använder implicit länkning, där Windows länkar appen till DLL vid laddning. Med den här länken kan appen anropa de DLL-tillhandahållna funktionerna precis som funktionerna i ett statiskt länkat bibliotek.
Den här genomgången omfattar inte några vanliga situationer. Koden visar inte att andra programmeringsspråk använder C++-DLL:er. Den visar inte hur du skapar en DLL för endast resurser, eller hur du använder explicit länkning för att läsa in DLL:er vid körning i stället för vid inläsningstid. Du kan vara säker på att du kan använda MSVC och Visual Studio för att göra alla dessa saker.
Även om koden för DLL:en är skriven i C++, använder vi C-formatgränssnitt för de exporterade funktionerna. Det finns två huvudsakliga orsaker till detta: För det första stöder många andra språk importer av funktioner i C-stil. Klientappen behöver inte skrivas i C++. För det andra undviker den några vanliga fallgropar relaterade till exporterade klasser och medlemsfunktioner. Det är enkelt att göra fel som är svåra att diagnostisera vid export av klasser, eftersom allt som refereras i en klassdeklaration måste ha en instansiering som också exporteras. Den här begränsningen gäller för DLL:er, men inte statiska bibliotek. Om dina klasser är vanligt gamla dataformat bör du inte stöta på det här problemet.
Länkar till mer information om DLL:er finns i Skapa C/C++ DLL:er i Visual Studio. Mer information om implicit länkning och explicit länkning finns i Fastställa vilken länkningsmetod som ska användas. Information om hur du skapar C++-DLL:er för användning med programmeringsspråk som använder C-språklänkningskonventioner finns i Exportera C++-funktioner för användning i körbara C-språk. Information om hur du skapar DLL:er för användning med .NET-språk finns i Anropa DLL-funktioner från Visual Basic-program.
Förutsättningar
- Microsoft Windows 7 eller senare. Vi rekommenderar den senaste versionen av Windows för bästa möjliga utveckling.
Visual Studio. Mer information om hur du laddar ned och installerar Visual Studio finns i Installera Visual Studio. När du kör installationsprogrammet kontrollerar du att skrivbordsutvecklingen med C++ -arbetsbelastningen är markerad. Oroa dig inte om du inte installerade den här arbetsbelastningen när du installerade Visual Studio. Du kan köra installationsprogrammet igen och installera det nu.
- Visual Studio. Information om hur du laddar ned och installerar Visual Studio 2015 finns i Installera Visual Studio 2015. Använd en anpassad installation för att installera C++-kompilatorn och verktygen, eftersom de inte är installerade som standard.
En förståelse av grunderna i att använda Visual Studio IDE. Om du har använt Windows-skrivbordsappar tidigare kan du förmodligen hänga med. En introduktion finns i Visual Studio IDE-funktionsvisning.
Viss kunskap om C++-språket. Oroa dig inte, vi gör inget för komplicerat.
Anmärkning
Den här genomgången förutsätter att du använder Visual Studio 2017 version 15.9 eller senare. Vissa tidigare versioner av Visual Studio 2017 hade fel i kodmallarna eller använde olika dialogrutor för användargränssnittet. Undvik problem genom att använda Visual Studio Installer för att uppdatera Visual Studio 2017 till version 15.9 eller senare.
Skapa DLL-projektet
I följande uppsättning uppgifter skapar du ett projekt för din DLL, lägger till kod och skapar den. Börja med att starta Visual Studio IDE och logga in om du behöver det. Anvisningarna varierar något beroende på vilken version av Visual Studio du använder. Om du vill se stegen för den önskade versionen av Visual Studio använder du versionsväljaren längst upp i innehållsförteckningen på den här sidan.
Skapa ett DLL-projekt i Visual Studio
I menyraden väljer du Arkiv>Nytt>projekt för att öppna dialogrutan Skapa ett nytt projekt .
Längst upp i dialogrutan anger du Språk till C++, anger Plattform till Windows och anger Projekttyp till Bibliotek.
I den filtrerade listan över projekttyper väljer du DLL (Dynamic-link Library) och sedan Nästa.
På sidan Konfigurera det nya projektet anger du MathLibrary i rutan Projektnamn för att ange ett namn för projektet. Lämna standardvärdena Plats och Lösningsnamn . Ange Lösning till Skapa ny lösning. Avmarkera Placera lösning och projekt i samma katalog om den är markerad.
Välj knappen Skapa för att skapa projektet.
När lösningen har skapats kan du se de genererade projekt- och källfilerna i Solution Explorer-fönstret i Visual Studio.
Skapa ett DLL-projekt i Visual Studio 2017
I menyraden väljer du Arkiv>Nytt>projekt för att öppna dialogrutan Nytt projekt .
I den vänstra rutan i dialogrutan Nytt projekt väljer du Installerat>Visual C++>Windows Desktop. I mittenfönstret väljer du Dynamic-Link Bibliotek (DLL). Ange MathLibrary i rutan Namn för att ange ett namn för projektet. Lämna standardvärdena Plats och Lösningsnamn . Ange Lösning till Skapa ny lösning. Kontrollera Skapa katalog för lösning om den är avmarkerad.
Välj ok-knappen för att skapa projektet.
När lösningen har skapats kan du se de genererade projekt- och källfilerna i Solution Explorer-fönstret i Visual Studio.
Skapa ett DLL-projekt i Visual Studio 2015 och äldre versioner
På menyraden väljer du Arkiv>Nytt>projekt.
I den vänstra rutan i dialogrutan Nytt projekt expanderar du Installerade>mallar och väljer Visual C++. Välj sedan Win32-konsolprogram i mittenfönstret. Ange MathLibrary i rutan Namnredigering för att ange ett namn för projektet. Lämna standardvärdena Plats och Lösningsnamn . Ange Lösning till Skapa ny lösning. Kontrollera Skapa katalog för lösning om den är avmarkerad.
Välj knappen OK för att stänga dialogrutan Nytt projekt och starta win32-programguiden.
Välj knappen Nästa . På sidan Programinställningar går du till Programtyp och väljer DLL.
Välj knappen Slutför för att skapa projektet.
När guiden har slutfört lösningen kan du se de genererade projekt- och källfilerna i Solution Explorer-fönstret i Visual Studio.
Just nu gör denna DLL inte så mycket. Sedan skapar du en rubrikfil för att deklarera funktionerna som DLL-exporterna har och lägger sedan till funktionsdefinitionerna i DLL:en för att göra den mer användbar.
Så här lägger du till en rubrikfil i DLL:en
Om du vill skapa en rubrikfil för dina funktioner går du till menyraden och väljer Projekt>Lägg till nytt objekt.
I dialogrutan Lägg till nytt objekt går du till den vänstra rutan och väljer Visual C++. I mittenfönstret väljer du Rubrikfil (.h). Ange
MathLibrary.hsom namn på huvudfilen.
Välj knappen Lägg till för att generera en tom rubrikfil som visas i ett nytt redigeringsfönster.
Ersätt innehållet i rubrikfilen med den här koden:
// 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();
Den här rubrikfilen deklarerar vissa funktioner för att skapa en generaliserad Fibonacci-sekvens med två inledande värden. Ett anrop till fibonacci_init(1, 1) genererar den välbekanta Fibonacci-nummersekvensen.
Lägg märke till förprocessorinstruktionerna överst i filen. Den nya projektmallen för ett DLL-projekt lägger <PROJECTNAME>_EXPORTS till i de definierade makrona för förprocessorn. I det här exemplet definierar MATHLIBRARY_EXPORTS Visual Studio när ditt MathLibrary DLL-projekt skapas.
När makrot MATHLIBRARY_EXPORTS har definierats ställer makrot MATHLIBRARY_API in __declspec(dllexport) modifieraren på funktionsdeklarationerna. Den här modifieraren instruerar kompilatorn och länkaren att exportera en funktion eller variabel från DLL:n för användning av andra program. När MATHLIBRARY_EXPORTS är odefinierat, till exempel när huvudfilen ingår i ett klientprogram, MATHLIBRARY_API tillämpar __declspec(dllimport) modifieraren på deklarationerna. Den här modifieraren optimerar importen av funktionen eller variabeln i ett program. Mer information finns i dllexport, dllimport.
Så här lägger du till en implementering i DLL:en
Högerklicka på noden Källfiler i Solution Explorer och välj Lägg till>nytt objekt. Skapa en ny
.cppfil med namnetMathLibrary.cpp, på samma sätt som du lade till en ny rubrikfil i föregående steg.I redigeringsfönstret väljer du fliken
MathLibrary.cppom den redan är öppen. Annars dubbelklickar du iMathLibrary.cppi mappen Källfiler i MathLibrary-projektet för att öppna den.I redigeraren ersätter du innehållet i
MathLibrary.cppfilen med följande kod:// 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_; }
I redigeringsfönstret väljer du fliken för MathLibrary.cpp om den redan är öppen. Annars dubbelklickar du på MathLibrary.cpp i mappen Källfiler i MathLibrary-projektet i Solution Explorer för att öppna den.
I redigeraren ersätter du innehållet i
MathLibrary.cppfilen med följande kod:// 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_; }
Kompilera DLL:en för att kontrollera att allt fungerar hittills. Kompilera genom att välja Skapa>bygglösning på menyraden. DLL och relaterade kompilatorutdata placeras i en mapp som heter Debug direkt under lösningsmappen. Om du skapar en Release-build placeras utdata i en mapp med namnet Release. Utdata bör se ut ungefär så här:
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 ==========
Grattis, du har skapat en DLL med Visual Studio! Därefter skapar du en klientapp som använder de funktioner som exporteras av DLL:en.
Skapa en klientapp som använder DLL
När du skapar en DLL bör du tänka på hur klientappar kan använda den. Om du vill anropa funktionerna eller komma åt data som exporteras av en DLL måste klientkällan ha deklarationerna tillgängliga vid kompileringstillfället. Under länkningstiden kräver länkaren information för att lösa funktionsanrop eller dataåtkomster. En DLL tillhandahåller den här informationen i ett importbibliotek, en fil som innehåller information om hur du hittar funktioner och data i stället för den faktiska koden. Och vid körning måste DLL-filen vara tillgänglig för klienten, på en plats som operativsystemet kan hitta.
Oavsett om det är din egen eller från en tredje part behöver klientappsprojektet flera informationsdelar för att kunna använda en DLL. Den måste hitta rubrikerna som deklarerar DLL-exporterna, importbiblioteken för länkaren och själva DLL:n. En lösning är att kopiera alla dessa filer till klientprojektet. För DLL:er från tredje part som sannolikt inte kommer att ändras när klienten är under utveckling kan den här metoden vara det bästa sättet att använda dem. Men när du även skapar DLL:en är det bättre att undvika duplicering. Om du gör en lokal kopia av DLL-filer som är under utveckling kan du oavsiktligt ändra en rubrikfil i en kopia men inte den andra, eller använda ett inaktuellt bibliotek.
För att undvika osynkroniseringskod rekommenderar vi att du anger inkluderingssökvägen i klientprojektet så att DLL-huvudfilerna inkluderas direkt från DLL-projektet. Ange också bibliotekssökvägen i klientprojektet så att den innehåller DLL-importbiblioteken från DLL-projektet. Och slutligen kopierar du den inbyggda DLL-filen från DLL-projektet till utdatakatalogen för klientbygget. Med det här steget kan klientappen använda samma DLL-kod som du skapar.
Skapa en klientapp i Visual Studio
I menyraden väljer du Arkiv>Nytt>projekt för att öppna dialogrutan Skapa ett nytt projekt .
Längst upp i dialogrutan anger du Språk till C++, anger Plattform till Windows och anger Projekttyp till Konsol.
I den filtrerade listan över projekttyper väljer du Konsolapp och sedan Nästa.
På sidan Konfigurera det nya projektet anger du MathClient i rutan Projektnamn för att ange ett namn för projektet. Lämna standardvärdena Plats och Lösningsnamn . Ange Lösning till Skapa ny lösning. Avmarkera Placera lösning och projekt i samma katalog om den är markerad.
Välj knappen Skapa för att skapa klientprojektet.
Ett minimalt konsolprogramprojekt skapas åt dig. Namnet på huvudkällans fil är samma som projektnamnet som du angav tidigare. I det här exemplet heter MathClient.cppdet . Du kan skapa den, men den använder inte din DLL ännu.
Skapa en klientapp i Visual Studio 2017
Om du vill skapa en C++-app som använder den DLL som du skapade väljer du Arkiv>nytt>projekt på menyraden.
I den vänstra rutan i dialogrutan Nytt projekt väljer du Windows Desktop under Installerad>Visual C++. I mittenfönstret väljer du Windows-konsolprogram. Ange namnet på projektet MathClient i rutan Namnredigering . Lämna standardvärdena Plats och Lösningsnamn . Ange Lösning till Skapa ny lösning. Kontrollera Skapa katalog för lösning om den är avmarkerad.
Välj OK för att skapa klientappprojektet.
Ett minimalt konsolprogramprojekt skapas åt dig. Namnet på huvudkällans fil är samma som projektnamnet som du angav tidigare. I det här exemplet heter MathClient.cppdet . Du kan skapa den, men den använder inte din DLL ännu.
Skapa en klientapp i Visual Studio 2015
Om du vill skapa en C++-app som använder den DLL som du skapade väljer du Arkiv>nytt>projekt på menyraden.
I den vänstra rutan i dialogrutan Nytt projekt väljer du Win32 under Installerade>mallar>Visual C++. I mittenfönstret väljer du Win32-konsolprogram. Ange namnet på projektet MathClient i rutan Namnredigering . Lämna standardvärdena Plats och Lösningsnamn . Ange Lösning till Skapa ny lösning. Kontrollera Skapa katalog för lösning om den är avmarkerad.
Välj knappen OK för att stänga dialogrutan Nytt projekt och starta win32-programguiden. På sidan Översikt i dialogrutan Win32-programguiden väljer du knappen Nästa .
På sidan Programinställningar går du till Programtyp och väljer Konsolprogram om det inte redan är valt.
Välj knappen Slutför för att skapa projektet.
När guiden är klar skapas ett minimalt projekt för en konsolapplikation åt dig. Namnet på huvudkällans fil är samma som projektnamnet som du angav tidigare. I det här exemplet heter MathClient.cppdet . Du kan skapa den, men den använder inte din DLL ännu.
Nästa steg, för att anropa MathLibrary-funktionerna i din källkod, måste projektet inkludera filen MathLibrary.h. Du kan kopiera den här huvudfilen till ditt klientappsprojekt och sedan lägga till den i projektet som ett befintligt objekt. Den här metoden kan vara ett bra alternativ för bibliotek från tredje part. Men om du arbetar med koden för din DLL och klienten samtidigt kan huvudfilerna bli osynkroniserade. Undvik det här problemet genom att ange sökvägen Ytterligare inkludera kataloger i projektet så att sökvägen inkluderas i den ursprungliga rubriken.
Så här lägger du till DLL-huvudet i din inkluderingssökväg
Högerklicka på noden MathClient i Solution Explorer för att öppna dialogrutan Egenskapssidor .
I listrutan Konfiguration väljer du Alla konfigurationer om den inte redan är markerad.
I den vänstra rutan väljer du Konfigurationsegenskaper>C/C++>Allmänt.
I egenskapsfönstret väljer du listrutekontrollen bredvid redigeringsrutan Ytterligare inkludera kataloger och väljer sedan Redigera.
Dubbelklicka i det övre fönstret i dialogrutan Ytterligare inkludera kataloger för att aktivera en redigeringskontroll. Eller välj mappikonen för att skapa en ny post.
I redigeringskontrollen anger du sökvägen till platsen för
MathLibrary.hhuvudfilen. Du kan välja ellipskontrollen (...) för att bläddra till rätt mapp.Du kan också ange en relativ sökväg från klientkällans filer till mappen som innehåller DLL-huvudfilerna. Om du har följt anvisningarna för att placera klientprojektet i en separat lösning från DLL:en bör den relativa sökvägen se ut så här:
..\..\MathLibrary\MathLibraryOm dina DLL- och klientprojekt finns i samma lösning kan den relativa sökvägen se ut så här:
..\MathLibraryNär DLL- och klientprojekten finns i andra mappar justerar du den relativa sökvägen så att den matchar. Du kan också använda ellipskontrollen för att bläddra efter mappen.
När du har angett sökvägen till rubrikfilen i dialogrutan Ytterligare inkludera kataloger väljer du knappen OK . I dialogrutan Egenskapssidor väljer du knappen OK för att spara ändringarna.
Nu kan du inkludera MathLibrary.h filen och använda de funktioner som den deklarerar i klientprogrammet. Ersätt innehållet i MathClient.cpp med den här koden:
// 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;
}
Den här koden kan kompileras, men inte länkas. Om du skapar klientappen nu visar fellistan flera LNK2019 fel. Det beror på att projektet saknar viss information: Du har inte angett att projektet har ett beroende av MathLibrary.lib biblioteket ännu. Och du har inte talat om för länkaren hur den ska hitta MathLibrary.lib-filen.
Du kan åtgärda problemet genom att kopiera biblioteksfilen direkt till klientappprojektet. Länkaren skulle hitta och använda den automatiskt. Men om både biblioteket och klientappen är under utveckling kan det leda till ändringar i en kopia som inte visas i den andra. För att undvika det här problemet kan du ange egenskapen Ytterligare beroenden för att meddela byggsystemet att projektet är MathLibrary.libberoende av . Och du kan ange en sökväg för ytterligare bibliotekskataloger i projektet för att inkludera sökvägen till det ursprungliga biblioteket när du länkar.
Så här lägger du till DLL-importbiblioteket i projektet
Högerklicka på noden MathClient i Solution Explorer och välj Egenskaper för att öppna dialogrutan Egenskapssidor .
I listrutan Konfiguration väljer du Alla konfigurationer om den inte redan är markerad. Det säkerställer att alla egenskapsändringar gäller för både felsöknings- och versionsversioner.
I den vänstra rutan väljer du Konfigurationsegenskaper>Länkare>Indata. I egenskapsfönstret väljer du listrutekontrollen bredvid redigeringsrutan Ytterligare beroenden och väljer sedan Redigera.
I dialogrutan Ytterligare beroenden lägger du till
MathLibrary.libi listan i den översta redigeringskontrollen.
Välj OK för att gå tillbaka till dialogrutan Egenskapssidor .
I den vänstra rutan väljer du Konfigurationsegenskaper>Länkare>Allmänt. I egenskapsfönstret väljer du listrutekontrollen bredvid redigeringsrutan Ytterligare bibliotekskataloger och väljer sedan Redigera.
Dubbelklicka i den övre rutan i dialogrutan Ytterligare bibliotekskataloger för att aktivera en redigeringskontroll. I redigeringskontrollen anger du sökvägen till platsen för
MathLibrary.libfilen. Som standard finns den i en mapp med namnet Felsök direkt under mappen DLL-lösning. Om du skapar en versionsversion placeras filen i en mapp med namnet Release. Du kan använda makrot$(IntDir)så att länkaren kan hitta din DLL, oavsett vilken typ av bygge du skapar. Om du har följt anvisningarna för att placera klientprojektet i en separat lösning från DLL-projektet bör den relativa sökvägen se ut så här:..\..\MathLibrary\$(IntDir)Om dina DLL- och klientprojekt finns på andra platser justerar du den relativa sökvägen så att den matchar.
När du har angett sökvägen till biblioteksfilen i dialogrutan Ytterligare bibliotekskataloger väljer du knappen OK för att gå tillbaka till dialogrutan Egenskapssidor . Välj OK för att spara egenskapsändringarna.
Klientappen kan nu kompilera och länka, men den har fortfarande inte allt den behöver för att köras. När operativsystemet läser in din app letar den efter MathLibrary DLL. Om den inte hittar DLL-filen i vissa systemkataloger, miljösökvägen eller den lokala appkatalogen misslyckas belastningen. Beroende på operativsystemet visas ett felmeddelande som liknar detta:
Ett sätt att undvika det här problemet är att kopiera DLL:en till katalogen som innehåller den körbara klienten som en del av byggprocessen. Du kan lägga till en händelse efter bygget i projektet för att lägga till ett kommando som kopierar DLL:en till din build-utdatakatalog. Kommandot som anges här kopierar endast DLL-filen om den saknas eller har ändrats. Den använder makron för att kopiera till och från felsöknings- eller versionsplatserna baserat på din byggkonfiguration.
Kopiera DLL-filen i en händelse efter byggningen
Högerklicka på noden MathClient i Solution Explorer och välj Egenskaper för att öppna dialogrutan Egenskapssidor .
I listrutan Konfiguration väljer du Alla konfigurationer om den inte redan är markerad.
I den vänstra rutan väljer du Konfigurationsegenskaper>Skapa händelser>efter bygghändelse.
I egenskapsfönstret väljer du redigeringskontrollen i fältet Kommandorad . Om du har följt anvisningarna för att placera klientprojektet i en separat lösning från DLL-projektet anger du följande kommando:
xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"Om dina DLL- och klientprojekt finns i andra kataloger ändrar du den relativa sökvägen till DLL:n så att den matchar.
Välj knappen OK för att spara ändringarna i projektegenskaperna.
Nu har klientappen allt den behöver för att skapa och köra. Skapa programmet genom att välja Skapa>bygglösning på menyraden. Utdatafönstret i Visual Studio bör ha något som liknar följande exempel beroende på din version av Visual Studio:
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 ==========
Grattis, du har skapat ett program som anropar funktioner i din DLL. Kör nu programmet för att se vad det gör. På menyraden väljer du Felsöka>Starta utan felsökning. Visual Studio öppnar ett kommandofönster som programmet ska köras i. Den sista delen av utdata bör se ut så här:
Tryck på valfri tangent för att stänga kommandofönstret.
Nu när du har skapat en DLL och ett klientprogram kan du experimentera. Prova att ange brytpunkter i koden för klientappen och kör appen i felsökningsprogrammet. Se vad som händer när du går in i ett biblioteksanrop. Lägg till andra funktioner i biblioteket eller skriv en annan klientapp som använder din DLL.
När du distribuerar din app måste du även distribuera de DLL:er som den använder. Det enklaste sättet att göra DLL:er som du skapar, eller som du inkluderar från tredje part, tillgängliga är att placera dem i samma katalog som din app. Det kallas app-lokal utplacering. Mer information om distribution finns i Distribution i Microsoft C++.