Program Club

Visual Studio C ++에서 타사 DLL 파일을 어떻게 사용합니까?

proclub 2020. 11. 3. 19:28
반응형

Visual Studio C ++에서 타사 DLL 파일을 어떻게 사용합니까?


LoadLibrary ()를 사용해야한다는 것을 이해합니다. 그러나 타사 DLL 파일을 사용하려면 어떤 다른 단계를 수행해야합니까?

나는 단순히 C ++로 뛰어 들었고 이것이 내가 (Java 프로그래머로서) 얻지 못한 유일한 부분이다. Qt 라이브러리와 tesseract-ocr을 사용하는 방법을 찾고 있지만 프로세스는 나에게 의미가 없으며 Google에 너무 어렵습니다.

사용중인 함수를 컴파일러에 어떻게 알립니 까? 타사 공급 업체의 포함 파일이 있어야합니까?


다른 모든 사람들이 말했듯이 LoadLibrary는이를 수행하기 어려운 방법이며 거의 필요하지 않습니다.

DLL은 링크 용 .lib 파일과 소스에 #include 할 하나 이상의 헤더 파일과 함께 제공되어야합니다. 헤더 파일은 DLL에서 사용할 수있는 클래스와 함수 프로토 타입을 정의합니다. LoadLibrary를 사용하는 경우에도 필요합니다.

라이브러리와 연결하려면 Linker / Input / Additional Dependencies 아래의 프로젝트 구성에 .lib 파일을 추가해야 할 수 있습니다.


타사 DLL을 VS 2008 C ++ 프로젝트에 통합하기 위해 다음을 수행했습니다 (2010, 2012 등으로 번역 할 수 있어야 함).

다른 헤더 파일과 함께 내 솔루션에 헤더 파일을 넣고 DLL의 함수를 호출하도록 코드를 변경했습니다 (그렇지 않으면이 모든 작업을 수행하는 이유는 무엇입니까?). : ^) 그런 다음 빌드를 변경하여 LIB 코드를 내 EXE에 연결하고 DLL을 제자리에 복사하고 '정리'를 수행 할 때 정리합니다. 아래에서 이러한 변경 사항에 대해 설명합니다.

두 개의 타사 DLL, A.DLL 및 B.DLL이 있고 각각 (A.LIB 및 B.LIB) 및 헤더 파일 (AH 및 BH)에 대한 스텁 LIB 파일이 있다고 가정합니다.

  • 예를 들어 Windows 탐색기를 사용하여 솔루션 디렉토리 아래에 "lib"디렉토리를 만듭니다.
  • 타사 .LIB 및 .DLL 파일을이 디렉터리에 복사합니다.

(사용하는 각 소스 빌드 대상 (디버그, 릴리스)에 대해 한 번씩 다음 변경 세트를 수행해야합니다.)

  1. EXE를 LIB 파일에 종속 시키십시오.

    • 구성 속성-> 링커-> 입력-> 추가 종속성으로 이동하여 .LIB 파일을 한 번에 하나씩 공백으로 구분하여 나열합니다 .A.LIB B.LIB
    • 구성 속성-> 일반-> 추가 라이브러리 디렉토리로 이동하여 "lib"디렉토리를 이미있는 디렉토리에 추가하십시오. 항목은 세미콜론 으로 구분 됩니다. 예를 들어 이미 $(SolutionDir)fodder거기에있는 경우 $(SolutionDir)fodder;$(SolutionDir)lib"lib"를 추가 하도록 변경합니다 .
  2. DLL을 출력 디렉터리에 강제로 복사합니다.

    • 구성 속성-> 빌드 이벤트-> 빌드 후 이벤트로 이동합니다.
    • 명령 줄에 다음을 입력합니다 (스위치 의미는 DOS 창에서 "XCOPY /?"참조).

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • 설명에 다음과 같이 입력 할 수 있습니다.

    Copy DLLs to Target Directory

    • 빌드에서 제외됨은 No. 를 클릭하십시오 OK.
  3. VS가 출력 폴더를 정리할 때 DLL을 정리하도록 지시합니다.

    • 구성 속성-> 일반-> 치료시 삭제할 확장으로 이동하고 "..."를 클릭합니다. *.dll목록 끝에 추가하고을 클릭 OK합니다.

Windows에서 DLL 파일을 사용하는 두 가지 방법은 다음과 같습니다.

  1. 연관된 헤더 파일이있는 스텁 라이브러리 (.lib)가 있습니다. 실행 파일을 lib 파일과 연결하면 프로그램을 시작할 때 DLL 파일이 자동으로로드됩니다.

  2. DLL을 수동으로로드합니다. 이것은 일반적으로 공통 인터페이스를 구현하는 DLL 파일이 많은 플러그인 시스템을 개발하는 경우 수행하려는 작업입니다. 이에 대한 자세한 내용 LoadLibraryGetProcAddress에 대한 설명서를 확인하십시오 .

Qt의 경우 프로젝트에 포함하고 연결할 수있는 헤더와 정적 라이브러리가 있다고 생각합니다.


연결 동적으로 Qt는을 사용하기 위해서는 당신은 지정해야합니다 lib파일 (일반적으로 qtmaind.lib, QtCored4.lib그리고 QtGuid4.lib에서 "디버그"configration에 대한)
Properties » Linker » Input » Additional Dependencies.

당신은 또한해야 libs와는 경로 지정 , 즉의를
Properties » Linker » General » Additional Library Directories.

그리고 당신은 당신 .dll과 같은 폴더에 저장 .exe하거나 당신의 경로 에있는 폴더에 해당 파일들을 런타임에 접근 할 수 있도록 해야합니다 .


늦게 바인딩하고 런타임에 가져온 함수 만 해결하려는 경우에만 LoadLibrary를 사용하면됩니다. 타사 dll을 사용하는 가장 쉬운 방법은 .lib에 링크하는 것입니다.


수정에 대한 답장 :

예, 타사 API는 필수 유형을 선언하는 구현 및 헤더 파일을 포함하는 dll 및 / 또는 lib로 구성되어야합니다. 어떤 방법을 사용하든 타입 정의를 알아야합니다. LoadLibrary의 경우 함수 포인터를 정의해야하므로 대신 자신의 헤더 파일을 쉽게 작성할 수 있습니다. 기본적으로 후기 바인딩을 원하는 경우에만 LoadLibrary를 사용하면됩니다. 이에 대한 한 가지 유효한 이유는 대상 PC에서 dll을 사용할 수 있는지 확실하지 않은 경우입니다.


사용할 수 있다면 타사 라이브러리에 * .lib 파일과 * .dll 파일이 있어야합니다. 프로젝트의 '링커'옵션에있는 입력 파일 목록에 * .lib를 추가하기 만하면됩니다.

이 * .lib 파일은 반드시 '정적'라이브러리 (코드 포함)는 아닙니다. 대신 * .lib는 실행 파일을 DLL에 연결하는 파일 일 수 있습니다.

참고 URL : https://stackoverflow.com/questions/495795/how-do-i-use-a-third-party-dll-file-in-visual-studio-c

반응형