연습: 자체 동적 연결 라이브러리 만들기 및 사용(C++)Walkthrough: Create and use your own Dynamic Link Library (C++)

이 단계별 연습에서는 Visual Studio IDE를 사용하여 Microsoft C++(MSVC)로 작성된 자체 DLL(동적 연결 라이브러리)을 만드는 방법을 보여 줍니다.This step-by-step walkthrough shows how to use the Visual Studio IDE to create your own dynamic link library (DLL) written in Microsoft C++ (MSVC). 그런 다음 다른 C++ 앱에서 DLL을 사용하는 방법을 보여줍니다.Then it shows how to use the DLL from another C++ app. DLL(UNIX 기반 운영 체제에서는 ‘공유 라이브러리’라고도 함)은 Windows 구성 요소의 가장 유용한 종류 중 하나입니다. DLLs (also known as shared libraries in UNIX-based operating systems) are one of the most useful kinds of Windows components. DLL을 코드 및 리소스를 공유하는 방법으로 사용하여 앱의 크기를 줄일 수 있습니다.You can use them as a way to share code and resources, and to shrink the size of your apps. DLL을 사용하면 애플리케이션을 더 쉽게 서비스하고 확장할 수 있습니다.DLLs can even make it easier to service and extend your apps.

이 연습에서는 어떤 수학 함수를 구현하는 DLL을 만듭니다.In this walkthrough, you'll create a DLL that implements some math functions. 그런 다음 DLL의 함수를 사용하는 콘솔 앱을 만듭니다.Then you'll create a console app that uses the functions from the DLL. 또한 Windows DLL에서 사용되는 몇 가지 프로그래밍 기법 및 규칙을 소개합니다.You'll also get an introduction to some of the programming techniques and conventions used in Windows DLLs.

이 연습에서는 다음 작업 방법을 배웁니다.This walkthrough covers these tasks:

  • Visual Studio에서 DLL 프로젝트를 만듭니다.Create a DLL project in Visual Studio.

  • 내보낸 함수 및 변수를 DLL에 추가합니다.Add exported functions and variables to the DLL.

  • Visual Studio에서 콘솔 앱 프로젝트를 만듭니다.Create a console app project in Visual Studio.

  • 콘솔 앱에서 DLL에서 가져온 함수 및 변수를 사용합니다.Use the functions and variables imported from the DLL in the console app.

  • 완성된 앱을 실행합니다.Run the completed app.

정적으로 연결된 라이브러리와 마찬가지로, DLL은 이름별로 변수, 함수 및 리소스를 내보냅니다.Like a statically linked library, a DLL exports variables, functions, and resources by name. 클라이언트 앱은 해당 변수, 함수 및 리소스를 사용하기 위해 이름을 가져옵니다.A client app imports the names to use those variables, functions, and resources. 정적으로 연결된 라이브러리와 달리, Windows는 링크 타임에 앱의 가져오기를 DLL의 내보내기와 연결하는 것이 아니라 로드 시간 또는 런타임에 앱의 가져오기를 DLL의 내보내기에 연결합니다.Unlike a statically linked library, Windows connects the imports in your app to the exports in a DLL at load time or at run time, instead of connecting them at link time. Windows에서는 이렇게 연결하려면 표준 C++ 컴파일 모델에 속하지 않는 추가 정보가 필요합니다.Windows requires extra information that isn't part of the standard C++ compilation model to make these connections. MSVC 컴파일러는 C++에 대한 몇 가지 Microsoft 전용 확장을 구현하여 이 추가 정보를 제공합니다.The MSVC compiler implements some Microsoft-specific extensions to C++ to provide this extra information. 이 연습에서는 내용을 전개해가면서 해당 확장을 설명합니다.We explain these extensions as we go.

이 연습에서는 두 개의 Visual Studio 솔루션을 만듭니다. 하나는 DLL을 빌드하는 솔루션이고, 다른 하나는 클라이언트 앱을 빌드하는 솔루션입니다.This walkthrough creates two Visual Studio solutions; one that builds the DLL, and one that builds the client app. DLL은 C 호출 규칙을 사용합니다.The DLL uses the C calling convention. 플랫폼, 호출 규칙 및 연결 규칙이 일치하는 경우 다른 프로그래밍 언어로 작성된 앱에서 호출할 수 있습니다.It can be called from apps written in other programming languages, as long as the platform, calling conventions, and linking conventions match. 클라이언트 앱은 Windows가 로드 시간에 앱을 DLL에 연결하는 ‘암시적 연결’을 사용합니다.The client app uses implicit linking, where Windows links the app to the DLL at load-time. 이 연결을 통해 앱은 DLL에서 제공한 함수를 정적으로 연결된 라이브러리의 함수처럼 호출할 수 있습니다.This linking lets the app call the DLL-supplied functions just like the functions in a statically linked library.

이 연습에서는 일부 일반적인 상황은 다루지 않습니다.This walkthrough doesn't cover some common situations. 코드는 다른 프로그래밍 언어로 C++ DLL 사용을 표시하지 않습니다.The code doesn't show the use of C++ DLLs by other programming languages. 리소스 전용 DLL 만드는 방법 또는 명시적 링크를 사용하여 로드 시간이 아닌 런타임에 DLL을 로드하는 방법을 보여 주지 않습니다.It doesn't show how to create a resource-only DLL, or how to use explicit linking to load DLLs at run-time rather than at load-time. MSVC와 Visual Studio를 사용하여 모든 작업을 수행할 수 있으니 안심해도 됩니다.Rest assured, you can use MSVC and Visual Studio to do all these things.

DLL에 대한 자세한 내용의 링크는 Visual Studio에서 C/C++ DLL 만들기를 참조하세요.For links to more information about DLLs, see Create C/C++ DLLs in Visual Studio. 암시적 연결 및 명시적 연결에 대한 자세한 내용은 사용할 연결 방법 결정을 참조하세요.For more information about implicit linking and explicit linking, see Determine which linking method to use. C 언어 연결 규칙을 사용하는 프로그래밍 언어로 사용할 C++ DLL을 만드는 방법에 대한 자세한 내용은 C++ 함수를 C 언어 실행 파일에서 사용할 수 있도록 내보내기를 참조하세요.For information about creating C++ DLLs for use with programming languages that use C-language linkage conventions, see Exporting C++ functions for use in C-language executables. .NET 언어로 사용할 DLL을 만드는 방법에 대한 자세한 내용은 Visual Basic 애플리케이션에서 DLL 함수 호출을 참조하세요.For information about how to create DLLs for use with .NET languages, see Calling DLL Functions from Visual Basic Applications.

사전 요구 사항Prerequisites

  • Microsoft Windows 7 이상 버전을 실행하는 컴퓨터.A computer that runs Microsoft Windows 7 or later versions. 최상의 개발 환경을 위해서는 Windows 10이 권장됩니다.We recommend Windows 10 for the best development experience.
  • Visual Studio.A copy of Visual Studio. Visual Studio를 다운로드 및 설치하는 방법에 대한 자세한 내용은 Visual Studio 설치를 참조하세요.For information on how to download and install Visual Studio, see Install Visual Studio. 설치 관리자를 실행할 때 C++를 사용한 데스크톱 개발 워크로드를 선택해야 합니다.When you run the installer, make sure that the Desktop development with C++ workload is checked. Visual Studio를 설치할 때 이 워크로드를 설치하지 않은 경우 걱정하지 마세요.Don't worry if you didn't install this workload when you installed Visual Studio. 설치 관리자를 다시 실행하고 바로 설치할 수 있습니다.You can run the installer again and install it now.

    C++를 사용한 데스크톱 개발Desktop development with C++

  • Visual Studio.A copy of Visual Studio. Visual Studio 2015를 다운로드 및 설치하는 방법에 대한 자세한 내용은 Visual Studio 2015 설치를 참조하세요.For information on how to download and install Visual Studio 2015, see Install Visual Studio 2015. 기본적으로 설치되지 않으므로 사용자 지정 C++ 설치를 사용하여 컴파일러 및 도구를 설치합니다.Use a Custom installation to install the C++ compiler and tools, since they're not installed by default.
  • Visual Studio IDE 사용의 기본 사항에 대한 이해.An understanding of the basics of using the Visual Studio IDE. 이전에 Windows 데스크톱 앱을 사용한 경우 내용을 따라갈 수 있습니다.If you've used Windows desktop apps before, you can probably keep up. 소개 내용을 살펴보려면 Visual Studio IDE 기능 둘러보기를 참조하세요.For an introduction, see Visual Studio IDE feature tour.

  • 내용을 따라가기에 충분한 C++ 언어의 기본 사항에 대한 이해.An understanding of enough of the fundamentals of the C++ language to follow along. 너무 복잡한 내용을 다루지는 않으므로 걱정하지 마세요.Don't worry, we don't do anything too complicated.

참고

이 연습에서는 Visual Studio 2017 버전 15.9 이상을 사용하고 있다고 가정합니다.This walkthrough assumes you're using Visual Studio 2017 version 15.9 or later. 일부 이전 버전의 Visual Studio 2017은 코드 템플릿에서 결함이 있거나 다른 사용자 인터페이스 대화 상자를 사용했습니다.Some earlier versions of Visual Studio 2017 had defects in the code templates, or used different user interface dialogs. 문제를 방지하려면 Visual Studio 설치 관리자를 사용하여 Visual Studio 2017을 버전 15.9 이상으로 업데이트합니다.To avoid problems, use the Visual Studio Installer to update Visual Studio 2017 to version 15.9 or later.

DLL 프로젝트 만들기Create the DLL project

이 작업 세트에서는 DLL용 프로젝트를 만들고 코드를 추가하고 빌드합니다.In this set of tasks, you create a project for your DLL, add code, and build it. 시작하려면 Visual Studio IDE를 시작하고 필요한 경우 로그인합니다.To begin, start the Visual Studio IDE, and sign in if you need to. 사용 중인 Visual Studio 버전에 따라 지침이 약간 다릅니다.The instructions vary slightly depending on which version of Visual Studio you're using. 이 페이지의 왼쪽 위에 있는 컨트롤에서 올바른 버전을 선택했는지 확인합니다.Make sure you have the correct version selected in the control in the upper left of this page.

Visual Studio 2019에서 DLL 프로젝트를 만들려면To create a DLL project in Visual Studio 2019

  1. 메뉴 모음에서 파일 >새로 만들기 >프로젝트 를 선택하여 새 프로젝트 만들기 대화 상자를 엽니다.On the menu bar, choose File > New > Project to open the Create a New Project dialog box.

    새 DLL 프로젝트 만들기Create a new DLL project

  2. 대화 상자 맨 위에서 언어C++ 로 설정하고 플랫폼Windows 로 설정하고 프로젝트 형식라이브러리 로 설정합니다.At the top of the dialog, set Language to C++, set Platform to Windows, and set Project type to Library.

  3. 필터링된 프로젝트 형식 목록에서 DLL(동적 연결 라이브러리) 을 선택하고 다음 을 선택합니다.From the filtered list of project types, select Dynamic-link Library (DLL), and then choose Next.

  4. 새 프로젝트 구성 페이지에서 프로젝트 이름 상자에 MathLibrary 를 입력하여 프로젝트의 이름을 지정합니다.In the Configure your new project page, enter MathLibrary in the Project name box to specify a name for the project. 기본 위치솔루션 이름 값은 그대로 둡니다.Leave the default Location and Solution name values. 솔루션새 솔루션 만들기 로 설정합니다.Set Solution to Create new solution. 동일한 디렉터리에 솔루션과 프로젝트 배치 가 선택된 경우 선택을 해제합니다.Uncheck Place solution and project in the same directory if it's checked.

  5. 만들기 단추를 선택하여 프로젝트를 만듭니다.Choose the Create button to create the project.

솔루션이 만들어지면 Visual Studio의 솔루션 탐색기 창에서 생성된 프로젝트 및 소스 파일을 볼 수 있습니다.When the solution is created, you can see the generated project and source files in the Solution Explorer window in Visual Studio.

Math Library가 강조 표시된 Visual Studio 2019 솔루션 탐색기의 스크린샷.Screenshot of the Visual Studio 2019 Solution Explorer window with the Math Library highlighted.

Visual Studio 2017에서 DLL 프로젝트를 만들려면To create a DLL project in Visual Studio 2017

  1. 메뉴 모음에서 파일, >새로 만들기>, 프로젝트 를 선택하여 새 프로젝트 대화 상자를 엽니다.On the menu bar, choose File > New > Project to open the New Project dialog box.

  2. 새 프로젝트 대화 상자의 왼쪽 창에서 설치된 > Visual C++ > Windows 데스크톱 을 선택합니다.In the left pane of the New Project dialog box, select Installed > Visual C++ > Windows Desktop. 가운데 창에서 DLL(동적 연결 라이브러리) 을 선택합니다.In the center pane, select Dynamic-Link Library (DLL). 이름 상자에 MathLibrary 를 입력하여 프로젝트 이름을 지정합니다.Enter MathLibrary in the Name box to specify a name for the project. 기본 위치솔루션 이름 값은 그대로 둡니다.Leave the default Location and Solution name values. 솔루션새 솔루션 만들기 로 설정합니다.Set Solution to Create new solution. 선택하지 않은 경우 솔루션에 대한 디렉터리 만들기 를 선택합니다.Check Create directory for solution if it's unchecked.

    이름 텍스트 상자의 Math Library를 보여 주는 Visual Studio 2017 새 프로젝트 대화 상자의 스크린샷Screenshot of the Visual Studio 2017 New Project dialog box showing Math Library in the Name text box.

  3. 확인 단추를 선택하여 프로젝트를 만듭니다.Choose the OK button to create the project.

솔루션이 만들어지면 Visual Studio의 솔루션 탐색기 창에서 생성된 프로젝트 및 소스 파일을 볼 수 있습니다.When the solution is created, you can see the generated project and source files in the Solution Explorer window in Visual Studio.

Math Library가 강조 표시된 Visual Studio 2017 솔루션 탐색기 창의 스크린샷Screenshot of the Visual Studio 2017 Solution Explorer window with the Math Library highlighted.

이전 버전의 Visual Studio 2015 이하에서 DLL 프로젝트를 만들려면To create a DLL project in Visual Studio 2015 and older versions

  1. 메뉴 모음에서 파일 > 새로 만들기 > 프로젝트 를 선택합니다.On the menu bar, choose File > New > Project.

  2. 새 프로젝트 대화 상자의 왼쪽 창에서 설치됨 > 템플릿 을 확장하고 Visual C++ 를 선택한 후 가운데 창에서 Win32 콘솔 애플리케이션 을 선택합니다.In the left pane of the New Project dialog box, expand Installed > Templates, and select Visual C++, and then in the center pane, select Win32 Console Application. 이름 편집 상자에 MathLibrary 를 입력하여 프로젝트 이름을 지정합니다.Enter MathLibrary in the Name edit box to specify a name for the project. 기본 위치솔루션 이름 값은 그대로 둡니다.Leave the default Location and Solution name values. 솔루션새 솔루션 만들기 로 설정합니다.Set Solution to Create new solution. 선택하지 않은 경우 솔루션에 대한 디렉터리 만들기 를 선택합니다.Check Create directory for solution if it's unchecked.

    이름 텍스트 상자의 Math Library를 보여 주는 Visual Studio 2015 새 프로젝트 대화 상자의 스크린샷Screenshot of the Visual Studio 2015 New Project dialog box showing Math Library in the Name text box.

  3. 확인 단추를 선택하여 새 프로젝트 대화 상자를 닫고 Win32 애플리케이션 마법사 를 시작합니다.Choose the OK button to dismiss the New Project dialog and start the Win32 Application Wizard.

    Win32 애플리케이션 마법사 개요Win32 Application Wizard Overview

  4. 다음 단추를 선택합니다.Choose the Next button. 애플리케이션 설정 페이지의 애플리케이션 유형 에서 DLL 을 선택합니다.On the Application Settings page, under Application type, select DLL.

    Win32 애플리케이션 마법사에서 DLL 만들기Create DLL in Win32 Application Wizard

  5. 마침 단추를 선택하여 프로젝트를 만듭니다.Choose the Finish button to create the project.

마법사가 솔루션을 완료하면 Visual Studio의 솔루션 탐색기 창에서 생성된 프로젝트 및 소스 파일을 볼 수 있습니다.When the wizard completes the solution, you can see the generated project and source files in the Solution Explorer window in Visual Studio.

Math Library가 강조 표시된 Visual Studio 2015 솔루션 탐색기 창의 스크린샷Screenshot of the Visual Studio 2015 Solution Explorer window with the Math Library highlighted.

지금은 이 DLL이 크게 하는 일이 없습니다.Right now, this DLL doesn't do very much. 다음으로, DLL이 내보내는 함수를 선언하는 헤더 파일을 만든 후 DLL에 함수 정의를 추가하여 더 유용하게 합니다.Next, you'll create a header file to declare the functions your DLL exports, and then add the function definitions to the DLL to make it more useful.

DLL에 헤더 파일을 추가하려면To add a header file to the DLL

  1. 함수의 헤더 파일을 만들려면 메뉴 모음에서 프로젝트 > 새 항목 추가 를 선택합니다.To create a header file for your functions, on the menu bar, choose Project > Add New Item.

  2. 새 항목 추가 대화 상자의 왼쪽 창에서 Visual C++ 를 선택합니다.In the Add New Item dialog box, in the left pane, select Visual C++. 가운데 창에서 헤더 파일 (.h) 을 선택합니다.In the center pane, select Header File (.h). 헤더 파일 이름으로 MathLibrary 를 지정합니다.Specify MathLibrary.h as the name for the header file.

    새 항목 추가 대화 상자에서 헤더 추가Add header in Add New Item dialog

  3. 추가 단추를 선택하여 빈 헤더 파일(새 편집기 창에 표시됨)을 생성합니다.Choose the Add button to generate a blank header file, which is displayed in a new editor window.

    편집기의 빈 MathLibrary.h 파일Empty MathLibrary.h file in editor

  4. 헤더 파일의 내용을 다음 코드로 바꿉니다.Replace the contents of the header file with this code:

    // 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();
    

이 헤더 파일은 두 개의 초기 값이 지정된 일반화된 피보나치 시퀀스를 생성하는 몇 가지 함수를 선언합니다.This header file declares some functions to produce a generalized Fibonacci sequence, given two initial values. fibonacci_init(1, 1) 호출은 친숙한 피보나치 수열을 생성합니다.A call to fibonacci_init(1, 1) generates the familiar Fibonacci number sequence.

파일 맨 위의 전처리기 문을 확인합니다.Notice the preprocessor statements at the top of the file. DLL 프로젝트용 새 프로젝트 템플릿은 정의된 전처리기 매크로에 PROJECTNAME_EXPORTS 를 추가합니다.The new project template for a DLL project adds PROJECTNAME_EXPORTS to the defined preprocessor macros. 이 예에서 Visual Studio는 MathLibrary DLL 프로젝트가 빌드될 때 MATHLIBRARY_EXPORTS 를 정의합니다.In this example, Visual Studio defines MATHLIBRARY_EXPORTS when your MathLibrary DLL project is built.

MATHLIBRARY_EXPORTS 매크로가 정의되면 MATHLIBRARY_API 매크로는 함수 선언에서 __declspec(dllexport) 한정자를 설정합니다.When the MATHLIBRARY_EXPORTS macro is defined, the MATHLIBRARY_API macro sets the __declspec(dllexport) modifier on the function declarations. 이 한정자는 DLL에서 함수 또는 변수를 내보내도록 컴파일러 및 링커에 알려 다른 애플리케이션에서 사용할 수 있도록 합니다.This modifier tells the compiler and linker to export a function or variable from the DLL for use by other applications. MATHLIBRARY_EXPORTS 가 정의되지 않은 경우(예: 헤더 파일이 클라이언트 애플리케이션에 의해 포함되는 경우) MATHLIBRARY_API 는 선언에 __declspec(dllimport) 한정자를 적용합니다.When MATHLIBRARY_EXPORTS is undefined, for example, when the header file is included by a client application, MATHLIBRARY_API applies the __declspec(dllimport) modifier to the declarations. 이 한정자는 애플리케이션에서 함수 또는 변수의 가져오기를 최적화합니다.This modifier optimizes the import of the function or variable in an application. 자세한 내용은 dllexport, dllimport를 참조하세요.For more information, see dllexport, dllimport.

DLL에 구현을 추가하려면To add an implementation to the DLL

  1. 솔루션 탐색기 에서 소스 파일 노드를 마우스 오른쪽 단추로 클릭하고 추가 > 새 항목 을 선택합니다.In Solution Explorer, right-click on the Source Files node and choose Add > New Item. 이전 단계에서 새 헤더 파일을 추가한 것과 동일한 방식으로 MathLibrary 라는 새 .cpp 파일을 만듭니다.Create a new .cpp file called MathLibrary.cpp, in the same way that you added a new header file in the previous step.

  2. 편집기 창에서 MathLibrary.cpp 가 이미 열려 있는 경우 해당 탭을 선택합니다.In the editor window, select the tab for MathLibrary.cpp if it's already open. 그러지 않으면 솔루션 탐색기 에서 MathLibrary 프로젝트의 소스 파일 폴더에 있는 MathLibrary.cpp 를 두 번 클릭하여 엽니다.If not, in Solution Explorer, double-click MathLibrary.cpp in the Source Files folder of the MathLibrary project to open it.

  3. 편집기에서 MathLibrary.cpp 파일의 내용을 다음 코드로 바꿉니다.In the editor, replace the contents of the MathLibrary.cpp file with the following code:

    // 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_;
    }
    
  1. 편집기 창에서 MathLibrary.cpp 가 이미 열려 있는 경우 해당 탭을 선택합니다.In the editor window, select the tab for MathLibrary.cpp if it's already open. 그러지 않으면 솔루션 탐색기 에서 MathLibrary 프로젝트의 소스 파일 폴더에 있는 MathLibrary.cpp 를 두 번 클릭하여 엽니다.If not, in Solution Explorer, double-click MathLibrary.cpp in the Source Files folder of the MathLibrary project to open it.

  2. 편집기에서 MathLibrary.cpp 파일의 내용을 다음 코드로 바꿉니다.In the editor, replace the contents of the MathLibrary.cpp file with the following code:

    // 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_;
    }
    

지금까지 수행한 모든 사항이 작동하는지 확인하려면 동적 연결 라이브러리를 컴파일합니다.To verify that everything works so far, compile the dynamic link library. 컴파일하려면 메뉴 모음에서 빌드 > 솔루션 빌드 를 선택합니다.To compile, choose Build > Build Solution on the menu bar. DLL 및 관련 컴파일러 출력은 솔루션 폴더 바로 아래에 Debug 라는 폴더에 배치됩니다.The DLL and related compiler output are placed in a folder called Debug directly below the solution folder. 릴리스 빌드를 만드는 경우 출력은 Release 라는 폴더에 배치됩니다.If you create a Release build, the output is placed in a folder called Release. 출력은 다음과 비슷합니다.The output should look something like this:

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 ==========

축하합니다. Visual Studio를 사용하여 DLL을 만들었습니다!Congratulations, you've created a DLL using Visual Studio! 다음으로, DLL에서 내보낸 함수를 사용하는 클라이언트 앱을 만듭니다.Next, you'll create a client app that uses the functions exported by the DLL.

DLL을 사용하는 클라이언트 앱 만들기Create a client app that uses the DLL

DLL을 만들 때 클라이언트 앱에서 사용할 수 있는 방법을 생각해 봅니다.When you create a DLL, think about how client apps may use it. 함수를 호출하거나 DLL에서 내보낸 데이터에 액세스하려면 클라이언트 소스 코드에는 컴파일 타임에 사용할 수 있는 선언이 있어야 합니다.To call the functions or access the data exported by a DLL, client source code must have the declarations available at compile time. 연결 시간에 링커에는 함수 호출 또는 데이터 액세스를 확인하는 정보가 필요합니다.At link time, the linker requires information to resolve the function calls or data accesses. DLL은 실제 코드 대신 함수 및 데이터를 찾는 방법에 대한 정보가 들어 있는 파일인 ‘라이브러리 가져오기’에서 이 정보를 제공합니다. A DLL supplies this information in an import library, a file that contains information about how to find the functions and data, instead of the actual code. 또한 런타임에 운영 체제가 찾을 수 있는 위치에서 클라이언트가 DLL을 사용할 수 있어야 합니다.And at run time, the DLL must be available to the client, in a location that the operating system can find.

클라이언트 앱 프로젝트는 자체 또는 타사와 관계없이 DLL을 사용하기 위한 여러 가지 정보가 필요합니다.Whether it's your own or from a third-party, your client app project needs several pieces of information to use a DLL. DLL 내보내기, 링커용 라이브러리 가져오기 및 DLL 자체를 선언하는 헤더를 찾아야 합니다.It needs to find the headers that declare the DLL exports, the import libraries for the linker, and the DLL itself. 한 가지 솔루션은 해당 파일을 모두 클라이언트 프로젝트에 복사하는 것입니다.One solution is to copy all of these files into your client project. 클라이언트가 개발 중일 때 변경될 가능성이 없는 타사 DLL의 경우 이 매서드가 DLL을 사용하는 최상의 방법이 될 수 있습니다.For third-party DLLs that are unlikely to change while your client is in development, this method may be the best way to use them. 그러나 DLL을 빌드하기도 할 경우에는 중복을 피하는 것이 좋습니다.However, when you also build the DLL, it's better to avoid duplication. 개발 중인 DLL 파일의 로컬 복사본을 만드는 경우 실수로 한 복사본의 헤더 파일은 변경하고 다른 복사본의 헤더 파일은 변경하지 않거나 오래된 라이브러리를 사용할 수 있습니다.If you make a local copy of DLL files that are under development, you may accidentally change a header file in one copy but not the other, or use an out-of-date library.

동기화되지 않은 코드를 방지하려면 클라이언트 프로젝트에 포함 경로를 설정하여 DLL 프로젝트에서 직접 DLL 헤더 파일을 포함하는 것이 좋습니다.To avoid out-of-sync code, we recommend you set the include path in your client project to include the DLL header files directly from your DLL project. 또한 클라이언트 프로젝트에 라이브러리 경로를 설정하여 DLL 프로젝트의 DLL 가져오기 라이브러리를 포함합니다.Also, set the library path in your client project to include the DLL import libraries from the DLL project. 마지막으로 DLL 프로젝트의 빌드된 DLL을 클라이언트 빌드 출력 디렉터리에 복사합니다.And finally, copy the built DLL from the DLL project into your client build output directory. 이 단계에서는 클라이언트 앱이 사용자가 빌드한 것과 같은 DLL 코드를 사용할 수 있습니다.This step allows your client app to use the same DLL code you build.

Visual Studio에서 클라이언트 앱을 만들려면To create a client app in Visual Studio

  1. 메뉴 모음에서 파일 >새로 만들기 >프로젝트 를 선택하여 새 프로젝트 만들기 대화 상자를 엽니다.On the menu bar, choose File > New > Project to open the Create a new project dialog box.

  2. 대화 상자 맨 위에서 언어C++ 로 설정하고 플랫폼Windows 로 설정하고 프로젝트 형식콘솔 로 설정합니다.At the top of the dialog, set Language to C++, set Platform to Windows, and set Project type to Console.

  3. 필터링된 프로젝트 형식 목록에서 콘솔 앱 을 선택한 후 다음 을 선택합니다.From the filtered list of project types, choose Console App then choose Next.

  4. 새 프로젝트 구성 페이지에서 프로젝트 이름 상자에 MathClient 를 입력하여 프로젝트의 이름을 지정합니다.In the Configure your new project page, enter MathClient in the Project name box to specify a name for the project. 기본 위치솔루션 이름 값은 그대로 둡니다.Leave the default Location and Solution name values. 솔루션새 솔루션 만들기 로 설정합니다.Set Solution to Create new solution. 동일한 디렉터리에 솔루션과 프로젝트 배치 가 선택된 경우 선택을 해제합니다.Uncheck Place solution and project in the same directory if it's checked.

    콘솔 앱 옵션이 강조 표시된 새 프로젝트 만들기 대화 상자의 스크린샷Screenshot of the Create a new project dialog box with the Console App option highlighted.

  5. 만들기 단추를 선택하여 클라이언트 프로젝트를 만듭니다.Choose the Create button to create the client project.

최소한의 콘솔 애플리케이션 프로젝트가 만들어집니다.A minimal console application project is created for you. 기본 소스 파일의 이름은 앞에서 입력한 프로젝트 이름과 같습니다.The name for the main source file is the same as the project name that you entered earlier. 이 예에서는 이름이 MathClient.cpp 입니다.In this example, it's named MathClient.cpp. 이 프로젝트를 빌드할 수 있지만, 아직 DLL이 사용되지는 않습니다.You can build it, but it doesn't use your DLL yet.

Visual Studio 2017에서 클라이언트 앱을 만들려면To create a client app in Visual Studio 2017

  1. 만든 DLL을 사용하는 C++ 앱을 만들려면 메뉴 모음에서 파일 >새로 만들기 >프로젝트 를 선택합니다.To create a C++ app that uses the DLL that you created, on the menu bar, choose File > New > Project.

  2. 새 프로젝트 대화 상자의 왼쪽 창의 설치됨 > Visual C++ 에서 Windows 데스크톱 을 선택합니다.In the left pane of the New Project dialog, select Windows Desktop under Installed > Visual C++. 가운데 창에서 Windows 콘솔 애플리케이션 을 선택합니다.In the center pane, select Windows Console Application. 이름 편집 상자에 프로젝트 이름 MathClient 를 지정합니다.Specify the name for the project, MathClient, in the Name edit box. 기본 위치솔루션 이름 값은 그대로 둡니다.Leave the default Location and Solution name values. 솔루션새 솔루션 만들기 로 설정합니다.Set Solution to Create new solution. 선택하지 않은 경우 솔루션에 대한 디렉터리 만들기 를 선택합니다.Check Create directory for solution if it's unchecked.

    설치됨 > Visual C++ > Windows 데스크톱이 선택되고 Windows 콘솔 애플리케이션이 강조 표시되었으며 이름 텍스트 상자에 Math Client가 입력된 새 프로젝트 대화 상자의 스크린샷Screenshot of the New Project dialog box with Installed > Visual C plus plus > Windows Desktop selected, Windows Console Application highlighted, and Math Client typed in the Name text box.

  3. 확인 을 선택하여 클라이언트 앱 프로젝트를 만듭니다.Choose OK to create the client app project.

최소한의 콘솔 애플리케이션 프로젝트가 만들어집니다.A minimal console application project is created for you. 기본 소스 파일의 이름은 앞에서 입력한 프로젝트 이름과 같습니다.The name for the main source file is the same as the project name that you entered earlier. 이 예에서는 이름이 MathClient.cpp 입니다.In this example, it's named MathClient.cpp. 이 프로젝트를 빌드할 수 있지만, 아직 DLL이 사용되지는 않습니다.You can build it, but it doesn't use your DLL yet.

Visual Studio 2015에서 클라이언트 앱을 만들려면To create a client app in Visual Studio 2015

  1. 만든 DLL을 사용하는 C++ 앱을 만들려면 메뉴 모음에서 파일 >새로 만들기 >프로젝트 를 선택합니다.To create a C++ app that uses the DLL that you created, on the menu bar, choose File > New > Project.

  2. 새 프로젝트 대화 상자의 왼쪽 창의 설치됨 > 템플릿 > Visual C++ 에서 Win32 를 선택합니다.In the left pane of the New Project dialog, select Win32 under Installed > Templates > Visual C++. 가운데 창에서 Win32 콘솔 애플리케이션 을 선택합니다.In the center pane, select Win32 Console Application. 이름 편집 상자에 프로젝트 이름 MathClient 를 지정합니다.Specify the name for the project, MathClient, in the Name edit box. 기본 위치솔루션 이름 값은 그대로 둡니다.Leave the default Location and Solution name values. 솔루션새 솔루션 만들기 로 설정합니다.Set Solution to Create new solution. 선택하지 않은 경우 솔루션에 대한 디렉터리 만들기 를 선택합니다.Check Create directory for solution if it's unchecked.

    설치됨 > 템플릿 > Visual C++ > Win32가 선택되고 Win32 콘솔 애플리케이션 Visual C++가 강조 표시되었으며 이름 텍스트 상자에 Math Client가 입력된 새 프로젝트 대화 상자의 스크린샷Screenshot of the New Project dialog box with Installed > Templates > Visual C plus plus > Win32 selected, Win32 Console Application Visual C plus plus highlighted, and Math Client typed in the Name text box.

  3. 확인 단추를 선택하여 새 프로젝트 대화 상자를 닫고 Win32 애플리케이션 마법사 를 시작합니다.Choose the OK button to dismiss the New Project dialog and start the Win32 Application Wizard. Win32 애플리케이션 마법사 대화 상자의 개요 페이지에서 다음 단추를 선택합니다.On the Overview page of the Win32 Application Wizard dialog box, choose the Next button.

  4. 애플리케이션 설정 페이지의 애플리케이션 유형 에서 콘솔 애플리케이션 이 아직 선택되어 있지 않으면 선택합니다.On the Application Settings page, under Application type, select Console application if it isn't already selected.

  5. 마침 단추를 선택하여 프로젝트를 만듭니다.Choose the Finish button to create the project.

마법사가 완료되면 최소한의 콘솔 애플리케이션 프로젝트가 만들어집니다.When the wizard finishes, a minimal console application project is created for you. 기본 소스 파일의 이름은 앞에서 입력한 프로젝트 이름과 같습니다.The name for the main source file is the same as the project name that you entered earlier. 이 예에서는 이름이 MathClient.cpp 입니다.In this example, it's named MathClient.cpp. 이 프로젝트를 빌드할 수 있지만, 아직 DLL이 사용되지는 않습니다.You can build it, but it doesn't use your DLL yet.

다음으로, 소스 코드에서 MathLibrary 함수를 호출하려면 프로젝트가 MathLibrary.h 파일을 포함해야 합니다.Next, to call the MathLibrary functions in your source code, your project must include the MathLibrary.h file. 이 헤더 파일을 클라이언트 앱 프로젝트에 복사한 후 프로젝트에 기존 항목으로 추가할 수 있습니다.You could copy this header file into your client app project, then add it to the project as an existing item. 이 방법은 타사 라이브러리에 적합할 수 있습니다.This method can be a good choice for third-party libraries. 그러나 DLL 및 클라이언트에 대한 코드에서 동시에 작업하는 경우 헤더 파일이 동기화되지 않을 수 있습니다. 이 문제를 방지하려면 원래 헤더 경로를 포함하도록 프로젝트의 추가 포함 디렉터리 경로를 설정합니다.However, if you're working on the code for your DLL and your client at the same time, the header files could get out of sync. To avoid this issue, set the Additional Include Directories path in your project to include the path to the original header.

포함 경로에 DLL 헤더를 추가하려면To add the DLL header to your include path

  1. 솔루션 탐색기 에서 MathClient 노드를 마우스 오른쪽 단추로 클릭하여 속성 페이지 대화 상자를 엽니다.Right-click on the MathClient node in Solution Explorer to open the Property Pages dialog.

  2. 구성 드롭다운 상자에서 모든 구성 이 아직 선택되어 있지 않으면 선택합니다.In the Configuration drop-down box, select All Configurations if it's not already selected.

  3. 왼쪽 창에서 구성 속성 > C/C++ > 일반 을 선택합니다.In the left pane, select Configuration Properties > C/C++ > General.

  4. 속성 창에서 추가 포함 디렉터리 편집 상자 옆에 있는 드롭다운 컨트롤을 선택한 후 편집 을 선택합니다.In the property pane, select the drop-down control next to the Additional Include Directories edit box, and then choose Edit.

    추가 포함 디렉터리 속성 편집Edit the Additional Include Directories property

  5. 추가 포함 디렉터리 대화 상자의 위쪽 창을 두 번 클릭하여 편집 컨트롤을 사용하도록 설정합니다.Double-click in the top pane of the Additional Include Directories dialog box to enable an edit control. 또는 폴더 아이콘을 선택하여 새 항목을 만듭니다.Or, choose the folder icon to create a new entry.

  6. 편집 컨트롤에서 MathLibrary.h 헤더 파일 위치 경로를 지정합니다.In the edit control, specify the path to the location of the MathLibrary.h header file. 줄임표( ... ) 컨트롤을 선택하여 올바른 폴더로 이동할 수 있습니다.You can choose the ellipsis (...) control to browse to the correct folder.

    클라이언트 소스 파일에서 DLL 헤더 파일이 포함된 폴더까지 상대 경로를 입력할 수도 있습니다.You can also enter a relative path from your client source files to the folder that contains the DLL header files. 클라이언트 프로젝트를 DLL과 별도의 솔루션에 배치하는 지침을 따른 경우 상대 경로는 다음과 같습니다.If you followed the directions to put your client project in a separate solution from the DLL, the relative path should look like this:

    ..\..\MathLibrary\MathLibrary

    DLL 및 클라이언트 프로젝트가 동일한 솔루션에 있는 경우 상대 경로는 다음과 같습니다.If your DLL and client projects are in the same solution, the relative path might look like this:

    ..\MathLibrary

    DLL 및 클라이언트 프로젝트가 다른 폴더에 있으면 상대 경로를 조정하여 일치시킵니다.When the DLL and client projects are in other folders, adjust the relative path to match. 또는 줄임표 컨트롤을 사용하여 폴더를 찾습니다.Or, use the ellipsis control to browse for the folder.

    추가 포함 디렉터리 속성에 헤더 위치 추가하기Add the header location to the Additional Include Directories property

  7. 추가 포함 디렉터리 대화 상자에서 헤더 파일에 대한 경로를 입력한 후 확인 단추를 선택합니다.After you've entered the path to the header file in the Additional Include Directories dialog box, choose the OK button. 속성 페이지 대화 상자에서 확인 단추를 선택하여 변경 내용을 저장합니다.In the Property Pages dialog box, choose the OK button to save your changes.

이제 MathLibrary.h 파일을 포함하고 해당 파일이 클라이언트 애플리케이션에서 선언하는 함수를 사용할 수 있습니다.You can now include the MathLibrary.h file and use the functions it declares in your client application. 다음 코드를 사용하여 MathClient.cpp 의 내용을 바꿉니다.Replace the contents of MathClient.cpp by using this code:

// 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;
}

이 코드를 컴파일할 수는 있지만 연결할 수는 없습니다.This code can be compiled, but not linked. 지금 클라이언트 앱을 빌드하는 경우 오류 목록에 몇 가지 LNK2019 오류가 표시됩니다.If you build the client app now, the error list shows several LNK2019 errors. 프로젝트에 일부 정보가 누락되었기 때문입니다. 프로젝트가 MathLibrary.lib 라이브러리에 대한 종속성을 가지는지 아직 지정하지 않았습니다.That's because your project is missing some information: You haven't specified that your project has a dependency on the MathLibrary.lib library yet. 또한 MathLibrary.lib 파일을 찾는 방법을 링커에 지시하지 않았습니다.And, you haven't told the linker how to find the MathLibrary.lib file.

이 문제를 해결하기 위해 라이브러리 파일을 클라이언트 앱 프로젝트에 직접 복사할 수 있습니다.To fix this issue, you could copy the library file directly into your client app project. 링커가 자동으로 검색하여 사용합니다.The linker would find and use it automatically. 하지만 라이브러리와 클라이언트 앱 둘 다 개발 중인 경우 한 복사본의 변경 사항이 다른 복사본에는 표시되지 않을 수 있습니다.However, if both the library and the client app are under development, that might lead to changes in one copy that aren't shown in the other. 이 문제를 방지하려면 추가 종속성 속성을 설정하여 프로젝트가 MathLibrary.lib 에 종속되어 있음을 빌드 시스템에 지시할 수 있습니다.To avoid this issue, you can set the Additional Dependencies property to tell the build system that your project depends on MathLibrary.lib. 그리고 연결할 때 원래 라이브러리 경로를 포함하도록 프로젝트의 추가 라이브러리 디렉터리 경로를 설정할 수 있습니다.And, you can set an Additional Library Directories path in your project to include the path to the original library when you link.

프로젝트에 DLL 가져오기 라이브러리를 추가하려면To add the DLL import library to your project

  1. 솔루션 탐색기 에서 MathClient 노드를 마우스 오른쪽 단추로 클릭하고 속성 을 선택하여 속성 페이지 대화 상자를 엽니다.Right-click on the MathClient node in Solution Explorer and choose Properties to open the Property Pages dialog.

  2. 구성 드롭다운 상자에서 모든 구성 이 아직 선택되어 있지 않으면 선택합니다.In the Configuration drop-down box, select All Configurations if it's not already selected. 이를 통해 디버그 및 릴리스 빌드 모두에 속성 변경이 적용됩니다.It ensures that any property changes apply to both Debug and Release builds.

  3. 왼쪽 창에서 구성 속성 > 링커 > 입력 을 선택합니다.In the left pane, select Configuration Properties > Linker > Input. 속성 창에서 추가 종속성 편집 상자 옆에 있는 드롭다운 컨트롤을 선택한 후 편집 을 선택합니다.In the property pane, select the drop-down control next to the Additional Dependencies edit box, and then choose Edit.

    추가 종속성 속성 편집Edit the Additional Dependencies property

  4. 추가 종속성 대화 상자에서 맨 위 편집 컨트롤의 목록에 MathLibrary.lib 를 추가합니다.In the Additional Dependencies dialog, add MathLibrary.lib to the list in the top edit control.

    라이브러리 종속성 추가Add the library dependency

  5. 확인 을 선택하여 속성 페이지 대화 상자로 돌아갑니다.Choose OK to go back to the Property Pages dialog box.

  6. 왼쪽 창에서 구성 속성 > 링커 > 일반 을 선택합니다.In the left pane, select Configuration Properties > Linker > General. 속성 창에서 추가 라이브러리 디렉터리 편집 상자 옆에 있는 드롭다운 컨트롤을 선택한 후 편집 을 선택합니다.In the property pane, select the drop-down control next to the Additional Library Directories edit box, and then choose Edit.

    추가 라이브러리 디렉터리 속성 편집Edit the Additional Library Directories property

  7. 추가 라이브러리 디렉터리 대화 상자의 위쪽 창을 두 번 클릭하여 편집 컨트롤을 사용하도록 설정합니다.Double-click in the top pane of the Additional Library Directories dialog box to enable an edit control. 편집 컨트롤에서 MathLibrary.lib 파일 위치 경로를 지정합니다.In the edit control, specify the path to the location of the MathLibrary.lib file. 기본적으로 DLL 솔루션 폴더 바로 아래에 Debug 라는 폴더에 있습니다.By default, it's in a folder called Debug directly under the DLL solution folder. 릴리스 빌드를 만드는 경우 파일은 Release 라는 폴더에 배치됩니다.If you create a release build, the file is placed in a folder called Release. 사용자가 만드는 빌드 종류와 관계없이 링커가 DLL을 찾을 수 있도록 $(IntDir) 매크로를 사용할 수 있습니다.You can use the $(IntDir) macro so that the linker can find your DLL, no matter which kind of build you create. 클라이언트 프로젝트를 DLL 프로젝트와는 별개의 솔루션에 배치하는 지침을 따른 경우 상대 경로는 다음과 같습니다.If you followed the directions to put your client project in a separate solution from the DLL project, the relative path should look like this:

    ..\..\MathLibrary\$(IntDir)

    DLL 및 클라이언트 프로젝트가 다른 위치에 있으면 상대 경로를 조정하여 일치시킵니다.If your DLL and client projects are in other locations, adjust the relative path to match.

    라이브러리 디렉터리 추가Add the library directory

  8. 추가 라이브러리 디렉터리 대화 상자에서 라이브러리 파일 경로를 입력한 후에는 확인 단추를 선택하여 속성 페이지 대화 상자로 돌아갑니다.Once you've entered the path to the library file in the Additional Library Directories dialog box, choose the OK button to go back to the Property Pages dialog box. 확인 을 선택하여 속성 변경 내용을 저장합니다.Choose OK to save the property changes.

이제 클라이언트 앱을 컴파일하고 연결할 수 있지만, 아직 실행하는 데 필요한 모든 사항이 갖춰지지는 않았습니다.Your client app can now compile and link successfully, but it still doesn't have everything it needs to run. 운영 체제가 앱을 로드할 때 MathLibrary DLL을 찾습니다.When the operating system loads your app, it looks for the MathLibrary DLL. 특정 시스템 디렉터리, 환경 경로 또는 로컬 앱 디렉터리에서 DLL을 찾을 수 없는 경우 로드에 실패합니다.If it can't find the DLL in certain system directories, the environment path, or the local app directory, the load fails. 운영 체제에 따라 다음과 같은 오류 메시지가 표시됩니다.Depending on the operating system, you'll see an error message like this:

MathLibrary DLL을 찾을 수 없음 오류MathLibrary DLL not found error

이 문제를 방지하는 한 가지 방법은 빌드 프로세스의 일부로 클라이언트 실행 파일을 포함하는 디렉터리에 DLL을 복사하는 것입니다.One way to avoid this issue is to copy the DLL to the directory that contains your client executable as part of the build process. 프로젝트에 빌드 후 이벤트 를 추가하여 DLL을 빌드 출력 디렉터리에 복사하는 명령을 추가하면 됩니다.You can add a Post-Build Event to your project, to add a command that copies the DLL to your build output directory. 여기에 지정된 명령은 DLL이 없거나 변경된 경우에만 해당 DLL을 복사합니다.The command specified here copies the DLL only if it's missing or has changed. 빌드 구성에 따라 매크로를 사용하여 디버그 또는 릴리스 위치에 복사합니다.It uses macros to copy to and from the Debug or Release locations, based on your build configuration.

빌드 후 이벤트에 DLL을 복사하려면To copy the DLL in a post-build event

  1. 솔루션 탐색기 에서 MathClient 노드를 마우스 오른쪽 단추로 클릭하고 속성 을 선택하여 속성 페이지 대화 상자를 엽니다.Right-click on the MathClient node in Solution Explorer and choose Properties to open the Property Pages dialog.

  2. 구성 드롭다운 상자에서 모든 구성 이 아직 선택되어 있지 않으면 선택합니다.In the Configuration drop-down box, select All Configurations if it isn't already selected.

  3. 왼쪽 창에서 구성 속성 > 빌드 이벤트 > 빌드 후 이벤트 를 선택합니다.In the left pane, select Configuration Properties > Build Events > Post-Build Event.

  4. 속성 창의 명령줄 필드에서 편집 컨트롤을 선택합니다.In the property pane, select the edit control in the Command Line field. 클라이언트 프로젝트를 DLL 프로젝트와는 별개의 솔루션에 배치하는 지침을 따른 경우 다음 명령을 입력합니다.If you followed the directions to put your client project in a separate solution from the DLL project, then enter this command:

    xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"

    DLL 및 클라이언트 프로젝트가 다른 디렉터리에 있으면 상대 경로를 DLL에 일치하도록 조정합니다.If your DLL and client projects are in other directories, change the relative path to the DLL to match.

    빌드 후 명령 추가Add the post-build command

  5. 확인 단추를 선택하여 프로젝트 속성의 변경 사항을 저장합니다.Choose the OK button to save your changes to the project properties.

이제 클라이언트 앱을 빌드 및 실행하는 데 필요한 모든 사항이 갖춰졌습니다.Now your client app has everything it needs to build and run. 메뉴 모음에서 빌드 > 솔루션 빌드 를 선택하여 애플리케이션을 빌드합니다.Build the application by choosing Build > Build Solution on the menu bar. Visual Studio의 출력 창에는 Visual Studio 버전에 따라 다음 예제와 같은 항목이 있어야 합니다.The Output window in Visual Studio should have something like the following example depending on your version of 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 ==========

축하합니다. DLL의 함수를 호출하는 애플리케이션을 만들었습니다.Congratulations, you've created an application that calls functions in your DLL. 이제 애플리케이션을 실행하여 수행하는 작업을 확인합니다.Now run your application to see what it does. 메뉴 모음에서 디버그 > 디버깅하지 않고 시작 을 선택합니다.On the menu bar, choose Debug > Start Without Debugging. Visual Studio에서 프로그램을 실행하기 위한 명령 창이 열립니다.Visual Studio opens a command window for the program to run in. 출력의 마지막 부분은 다음과 같습니다.The last part of the output should look like:

디버깅하지 않고 클라이언트 앱 시작Start the client app without debugging

아무 키나 눌러 명령 창을 닫습니다.Press any key to dismiss the command window.

이제 DLL과 클라이언트 애플리케이션을 만들었으므로 실험할 수 있습니다.Now that you've created a DLL and a client application, you can experiment. 클라이언트 앱의 코드에 중단점을 설정하고 디버거에서 앱을 실행합니다.Try setting breakpoints in the code of the client app, and run the app in the debugger. 라이브러리 호출을 한 단계씩 코드 실행할 때 어떤 일이 발생하는지 확인합니다.See what happens when you step into a library call. 라이브러리에 DLL을 사용하는 다른 함수를 추가하거나, DLL을 사용하는 다른 클라이언트 앱을 작성합니다.Add other functions to the library, or write another client app that uses your DLL.

앱을 배포할 때 앱에 사용되는 DLL도 배포해야 합니다.When you deploy your app, you must also deploy the DLLs it uses. 직접 빌드하거나 타사에서 포함하는 DLL을 사용할 수 있게 만드는 가장 간단한 방법은 앱과 같은 디렉터리에 배치하는 것입니다.The simplest way to make the DLLs that you build, or that you include from third parties, available is to put them in the same directory as your app. ‘앱 로컬 배포’라고 합니다. It's known as app-local deployment. 배포에 대한 자세한 내용은 Deployment in Visual C++를 참조하세요.For more information about deployment, see Deployment in Visual C++.

참조See also

Visual Basic 애플리케이션에서 DLL 함수 호출Calling DLL Functions from Visual Basic Applications