본문 바로가기

Qt/라이브러리

Qt에서 공유 라이브러리 만들기


공유 라이브러리를 생성할 때에는 클라이언트 코드[각주: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에서 외부 라이브러리 사용하기를 참조하자.


  1. 다른 라이브러리, 응용 프로그램 [본문으로]
  2. 함수, 변수, 클래스 [본문으로]
  3. 이렇게 익스포트되는 심볼들을 공용 심볼이라 함 [본문으로]