__declspec (dllimport)은 실제로 무엇을 의미합니까?


답변:


118

__declspec스토리지 클래스 정보를 지정할 수있는 Microsoft 특정 속성입니다.
(Nitpicker 's Corner : 그러나 GCC와 같은 다른 많은 컴파일러 공급 업체는 Microsoft의 컴파일러를 대상으로 작성된 설치된 코드 기반과의 호환성을 위해이 언어 확장을 지원합니다. 일부는 추가 스토리지 클래스 속성을 제공하기도합니다.)

지정할 수있는 스토리지 클래스 속성 중 두 가지는 dllimportdllexport입니다. 이는 함수 나 개체가 DLL에서 (각각) 가져 오거나 내보내진다는 것을 컴파일러에 나타냅니다.

보다 구체적으로 말하면 모듈 정의 ( .DEF) 파일 없이 클라이언트에 대한 DLL의 인터페이스를 정의 합니다. 대부분의 사람들은 DEF 파일을 만드는 것보다 이러한 언어 확장을 사용하는 것이 훨씬 쉽습니다.

명백한 이유를 위해, __declspec(dllimport)그리고 __declspec(dllexport)일반적으로 서로 짝을한다. 를 사용 dllexport하여 DLL에서 내 보낸 심볼을 표시하고 dllimport내 보낸 심볼을 다른 파일로 가져 오는 데 사용 합니다.

이로 인해 DLL을 컴파일 할 때와 DLL의 인터페이스를 사용하는 클라이언트 코드 모두에서 일반적으로 동일한 헤더 파일이 사용되기 때문에 컴파일시 적절한 특성 지정자로 자동 확인되는 매크로를 정의하는 것이 일반적인 패턴입니다. 예를 들면 :

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

그런 다음 내보낼 모든 기호를 DLLEXPORT.

아마도 그것이 Q_CORE_EXPORT매크로가하는 일이며 Q_DECL_IMPORT또는 Q_DECL_EXPORT.


__declspec은 제대로 "MS 전용"이 아니며 (훨씬 더 "컴파일러에 따라 다름) 일부 컴파일러는 다중 플랫폼에도이 선언을 사용합니다. 일부 속성 값은 (dllexport / dllimports는 실제로 MS에 따라 다릅니다. DLL은 MS입니다. 사전).
에밀리오 Garavaglia

9
@Emilio : 제가 아는 한 Microsoft __declspec는 C ++ 언어의 확장으로 표기법을 발명했습니다 . 나는 GCC가 이제 그것을 지원한다고 믿지만, 그것은 주로 마이크로 소프트 컴파일러와의 호환성 때문이다. 그리고 "MS 특정"이 "컴파일러 특정"과 어떻게 다른지 이해하지 못합니다. Microsoft는 C ++ 컴파일러를 작성했으며 많은 사람들이이를 사용합니다. Visual Studio와 함께 제공됩니다.
Cody Gray

8
Microsoft는 컴파일러를 만듭니다. "Microsoft C / C ++ Optimizing Compiler", cl.exe라고합니다. 많은 사람들이 Visual Studio를 컴파일러처럼 잘못 언급하지만 IDE입니다. 사람들이 "마이크로 소프트 특유"가 무엇을 의미하는지에 대해 왜 안타까운 지 모르겠습니다. "MS 환경"(그것이 무엇이든)을 의미하지 않으며 확실히 "Windows"를 의미하지도 않습니다. 예, 다른 컴파일러 공급 업체는 이제 Microsoft 컴파일러를 대상으로 작성된 코드의 설치 기반과의 호환성을 위해 확장을 지원합니다. 앞서 말했듯이 내가 아는 한 Microsoft는 구문을 발명했습니다. 그게 여기에있는 요점입니다.
Cody Gray

2
@CodyGray : Microsoft만으로는 충분하지 않습니다. 그러나 마이크로 소프트가 그것을 발명했고, 표준이 포함되지 않았고, 다른 사람들은 호환성을 위해서만 그것을 구현하고, 마이크로 소프트 윈도우를 대상으로하는 프로그램에 주로 (배타적이지는 않더라도) 함께 사용되어 "마이크로 소프트 특정"이라고 부르는 매우 강력한 포인트를
만들었습니다

6
특히 "DLL을 컴파일 할 때와 클라이언트 코드에서 모두 동일한 헤더 파일이 일반적으로 사용되기 때문에"에 대한 부분은 대단한 대답입니다! 가져 오기 / 내보내기 항목의 모든 측면을 명확하게합니다.
Ela782

30

__declspec(dllimport) 함수, 개체 또는 데이터 형식이 외부 DLL에 정의되어 있음을 컴파일러에 알려주는 저장소 클래스 지정자입니다.

함수, 개체 또는 데이터 형식은 해당하는 __declspec(dllexport).


6
확인. 마지막으로 2 시간 동안 읽은 후 가장 만족스럽고 간결하며 내가 원하는 내용에 대한 정확한 내용을 찾았습니다.
el psy Congroo

1

__declspec(dllexport).dll을 컴파일 할 때 이러한 기호를 내보내기 테이블에 배치해야 함을 링커에 알리도록 컴파일러에 지시합니다. .dll과 링크하는 프로그램을 컴파일 할 때 __declspec(dllimport)컴파일러에게 일반적인 립 상대 레지스터 직접이 아닌 립 상대 절대 레지스터 간접 간접 호출 (링커가 가져 오기 테이블을 가리 키도록 확인)을 생성하도록 지시합니다. 정의되지 않은 함수에 간접 호출 명령어 지시합니다 (명령어를 수정할 수 없기 때문에 링커는 다음의 상대 주소를 삽입합니다. 썽크를 만든 다음 썽크를 생성하고, 내부에 가져 오기 테이블의 함수 포인터에 대한 립 상대 절대 레지스터 간접 호출을 배치합니다. 이것은 코드 크기와 속도 최적화입니다. 가져올 심볼을 링커에 알려주는 가져 오기 라이브러리 .lib이며 가져 오기 테이블을 만들고 .text 세그먼트에 필요한 썽크를 만드는 데 가이드로 사용됩니다.

https://docs.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=vs-2019 https://docs.microsoft.com/en-us/cpp / build / importing-data-using-declspec-dllimport? view = vs-2019 https://stackoverflow.com/a/4490536/7194773


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.