- https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application 참조.
- https://doc.qt.io/qt-6.5/sharedlibrary.html 참조.
- 실행 환경: Windows 10 Home 22H2 64-bit
- 빌드 환경: Qt 6.5.0, Qt Creator 11.0.1, MinGW 11.2.0 64-bit
공유 라이브러리를 생성할 때에는 클라이언트 코드가 사용하려는 심볼 1들을 특별한 방식으로 표시해서 제대로 2익스포트되도록 해야 한다. 이렇게 익스포트된 공유 라이브러리는 클라이언트가 3임포트해서 사용할 수 있다. Qt는 클라이언트가 사용할 심볼을 익스포트, 임포트하기 위해 Q_DECL_EXPORT, Q_DECL_IMPORT 매크로를 제공한다.
예를 들어, mysharedlib라는 공유 라이브러리를 만든다면 헤더 파일을 다음과 같이 작성할 수 있다.
#include <QtCompilerDetection>
#if defined (MYSHAREDLIB_LIBRARY)
#define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
#define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif
MYSHAREDLIB_EXPORT void foo();
class MYSHAREDLIB_EXPORT MyClass
{
public:
MyClass();
};
MYSHAREDLIB_LIBRARY 매크로는 DEFINES 변수를 써서 프로젝트 파일에 정의하자.
DEFINES += MYSHAREDLIB_LIBRARY
전체 프로젝트 파일의 내용은 다음과 같다.
TEMPLATE = lib
SOURCES += mysharedlib.cpp
HEADERS += mysharedlib.h
DEFINES += MYSHAREDLIB_LIBRARY
여기까지 작성하고 빌드하면 라이브러리 파일이 타겟 폴더에 생성된다. MinGW로 컴파일 했다면 libmysharedlib.a와 mysharedlib.dll이 생성되고, MSVC로 컴파일 했다면 mysharedlib.lib와 mysharedlib.dll이 생성된다.
그런데 만약 mysharedlib를 구성하는 파일이 여러 개라면 헤더 파일 마다 #if defined ~ #endif를 다 추가해야 한다. 불편하다. 그래서 mysharedlib_global.h를 만들어 #if defined ~ #endif를 분리한다.
#include <QtCompilerDetection>
#if defined (MYSHAREDLIB_LIBRARY)
#define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
#define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif
그리고 각 헤더 파일에서 mysharedlib_global.h를 인클루드한다.
#include "mysharedlibrary_global.h"
MYSHAREDLIB_EXPORT void foo();
class MYSHAREDLIB_EXPORT MyClass
{
public:
MyClass();
};
Qt Creator에서 Library 프로젝트를 만들면 구성 파일이 이런 구조로 생성된다.
공유 라이브러리를 사용하는 방법에 대해서는 Qt/Qt Creator에서 외부 라이브러리 사용하기를 참조하자.
'Qt > 라이브러리' 카테고리의 다른 글
Visual Studio 스타일 도킹 윈도우: Advanced Docking System for Qt (0) | 2024.01.06 |
---|---|
LED 인디케이터: QLedIndicator (0) | 2024.01.02 |
Qt/Qt Creator에서 외부 라이브러리 사용하기 (0) | 2023.12.25 |