다음과 같은 Qt 소스 코드를 보았습니다.
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
다음 Q_CORE_EXPORT
과 같이 정의하는 매크로 :
define Q_DECL_IMPORT __declspec(dllimport)
그래서 __declspec(dllimport)
정말로 무엇을 의미합니까?
답변:
__declspec
스토리지 클래스 정보를 지정할 수있는 Microsoft 특정 속성입니다.
(Nitpicker 's Corner : 그러나 GCC와 같은 다른 많은 컴파일러 공급 업체는 Microsoft의 컴파일러를 대상으로 작성된 설치된 코드 기반과의 호환성을 위해이 언어 확장을 지원합니다. 일부는 추가 스토리지 클래스 속성을 제공하기도합니다.)
지정할 수있는 스토리지 클래스 속성 중 두 가지는 dllimport
및 dllexport
입니다. 이는 함수 나 개체가 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
는 C ++ 언어의 확장으로 표기법을 발명했습니다 . 나는 GCC가 이제 그것을 지원한다고 믿지만, 그것은 주로 마이크로 소프트 컴파일러와의 호환성 때문이다. 그리고 "MS 특정"이 "컴파일러 특정"과 어떻게 다른지 이해하지 못합니다. Microsoft는 C ++ 컴파일러를 작성했으며 많은 사람들이이를 사용합니다. Visual Studio와 함께 제공됩니다.
__declspec(dllimport)
함수, 개체 또는 데이터 형식이 외부 DLL에 정의되어 있음을 컴파일러에 알려주는 저장소 클래스 지정자입니다.
함수, 개체 또는 데이터 형식은 해당하는 __declspec(dllexport)
.
__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