QLibrary Class
QLibrary 클래스는 런타임에 공유 라이브러리를 로드합니다. 더 보기...
헤더: | #include <QLibrary> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
상속합니다: | QObject |
- 상속된 멤버를 포함한 모든 멤버 목록
- QLibrary는 플러그인 클래스의 일부입니다.
참고: 이 클래스의 모든 함수는 재진입합니다.
공용 유형
enum | LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint } |
flags | LoadHints |
속성
공용 함수
QLibrary(QObject *parent = nullptr) | |
QLibrary(const QString &fileName, QObject *parent = nullptr) | |
QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr) | |
QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr) | |
virtual | ~QLibrary() |
QString | errorString() const |
QString | fileName() const |
bool | isLoaded() const |
bool | load() |
QLibrary::LoadHints | loadHints() const |
QFunctionPointer | resolve(const char *symbol) |
void | setFileName(const QString &fileName) |
void | setFileNameAndVersion(const QString &fileName, const QString &version) |
void | setFileNameAndVersion(const QString &fileName, int versionNumber) |
void | setLoadHints(QLibrary::LoadHints hints) |
bool | unload() |
정적 공개 멤버
bool | isLibrary(const QString &fileName) |
QFunctionPointer | resolve(const QString &fileName, const char *symbol) |
QFunctionPointer | resolve(const QString &fileName, const QString &version, const char *symbol) |
QFunctionPointer | resolve(const QString &fileName, int verNum, const char *symbol) |
상세 설명
QLibrary 객체의 인스턴스는 단일 공유 객체 파일("라이브러리"라고 부르지만 "DLL"이라고도 함)에서 작동합니다. QLibrary는 플랫폼에 독립적인 방식으로 라이브러리의 기능에 대한 액세스를 제공합니다. 생성자에서 파일 이름을 전달하거나 setFileName()를 사용하여 명시적으로 설정할 수 있습니다. 라이브러리를 로드할 때 파일 이름에 절대 경로가 없는 한, QLibrary는 모든 시스템별 라이브러리 위치(예: Unix의 경우 LD_LIBRARY_PATH
)에서 검색합니다.
파일 이름이 절대 경로인 경우 이 경로를 먼저 로드하려고 시도합니다. 파일을 찾을 수 없는 경우, QLibrary는 Unix 및 Mac의 "lib"와 같은 다른 플랫폼별 파일 접두사와 Unix의 ".so", Mac의 ".dylib" 또는 Windows의 ".dll"과 같은 접미사가 포함된 이름을 시도합니다.
파일 경로가 절대 경로가 아닌 경우 QLibrary는 검색 순서를 수정하여 시스템별 접두사 및 접미사를 먼저 시도한 다음 지정된 파일 경로를 시도합니다.
이렇게 하면 기본 이름(즉, 접미사 없이)으로만 식별되는 공유 라이브러리를 지정할 수 있으므로 동일한 코드가 여러 운영 체제에서 작동하면서도 라이브러리를 찾기 위한 시도 횟수를 최소화할 수 있습니다.
가장 중요한 함수는 라이브러리 파일을 동적으로 로드하는 load(), 로드 성공 여부를 확인하는 isLoaded(), 라이브러리에서 심볼을 확인하는 resolve()입니다. resolve () 함수는 라이브러리가 아직 로드되지 않은 경우 암시적으로 로드를 시도합니다. QLibrary의 여러 인스턴스를 사용하여 동일한 물리적 라이브러리에 액세스할 수 있습니다. 일단 로드된 라이브러리는 애플리케이션이 종료될 때까지 메모리에 남아 있습니다. unload ()를 사용하여 라이브러리를 언로드하려고 시도할 수 있지만 다른 QLibrary 인스턴스가 동일한 라이브러리를 사용하고 있는 경우 호출이 실패하고 모든 인스턴스가 unload()를 호출한 경우에만 언로드가 수행됩니다.
QLibrary의 일반적인 용도는 라이브러리에서 내보낸 심볼을 확인하고 이 심볼이 나타내는 C 함수를 호출하는 것입니다. 이를 라이브러리에 대해 실행 파일을 링크할 때 빌드 프로세스의 링크 단계에서 수행되는 "암시적 링크"와 대조적으로 "명시적 링크"라고 합니다.
다음 코드 스니펫은 라이브러리를 로드하고 심볼 "mysymbol"을 확인한 후 모든 것이 성공하면 함수를 호출합니다. 라이브러리 파일이 존재하지 않거나 심볼이 정의되지 않는 등 문제가 발생하면 함수 포인터는 nullptr
가 되어 호출되지 않습니다.
QLibrary myLib("mylib"); typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); if (myFunction) myFunction();
resolve()가 작동하려면 심볼을 라이브러리에서 C 함수로 내보내야 합니다. 즉, 라이브러리가 C++ 컴파일러로 컴파일되는 경우 함수를 extern "C"
블록으로 래핑해야 합니다. Windows에서는 dllexport
매크로를 사용해야 하며, 자세한 방법은 resolve()을 참조하세요. 편의를 위해 라이브러리를 명시적으로 먼저 로드하지 않고 라이브러리에서 함수를 호출하려는 경우 사용할 수 있는 정적 resolve() 함수가 있습니다:
typedef void (*MyPrototype)(); MyPrototype myFunction = (MyPrototype) QLibrary::resolve("mylib", "mysymbol"); if (myFunction) myFunction();
QPluginLoader 를참조하세요 .
멤버 유형 문서
열거형 QLibrary::LoadHint
플래그 QLibrary::LoadHints
이 열거형은 라이브러리가 로드될 때 처리되는 방식을 변경하는 데 사용할 수 있는 가능한 힌트를 설명합니다. 이 값은 라이브러리가 로드될 때 심볼이 확인되는 방식을 나타내며 setLoadHints() 함수를 사용하여 지정합니다.
상수 | 값 | 설명 |
---|---|---|
QLibrary::ResolveAllSymbolsHint | 0x01 | resolve() 호출 시뿐만 아니라 라이브러리가 로드될 때 라이브러리의 모든 심볼이 확인되도록 합니다. |
QLibrary::ExportExternalSymbolsHint | 0x02 | 나중에 로드되는 다른 동적으로 로드된 라이브러리에서 확인할 수 있도록 라이브러리에서 확인되지 않은 외부 심볼을 내보냅니다. |
QLibrary::LoadArchiveMemberHint | 0x04 | 라이브러리의 파일 이름으로 아카이브 파일 내의 특정 객체 파일을 지정할 수 있습니다. 이 힌트가 제공되면 라이브러리의 파일 이름은 아카이브 파일에 대한 참조인 경로와 그 뒤에 아카이브 멤버에 대한 참조로 구성됩니다. |
QLibrary::PreventUnloadHint | 0x08 | close()가 호출될 경우 주소 공간에서 라이브러리가 언로드되지 않도록 합니다. 나중에 open()이 호출되면 라이브러리의 정적 변수가 다시 초기화되지 않습니다. |
QLibrary::DeepBindHint | 0x10 | 로드된 라이브러리에서 외부 심볼을 확인할 때 링커가 로드된 애플리케이션에서 내보낸 정의보다 로드된 라이브러리의 정의를 우선시하도록 지시합니다. 이 옵션은 Linux에서만 지원됩니다. |
LoadHints 유형은 QFlags<LoadHint>에 대한 typedef입니다. LoadHint 값의 OR 조합을 저장합니다.
loadHints 를참조하십시오 .
속성 문서
fileName : QString
이 속성은 라이브러리의 파일 이름을 보유합니다.
QLibrary 은 적절한 접미사가 있는 파일을 자동으로 검색하므로 파일 이름에서 파일 접미사를 생략하는 것이 좋습니다( isLibrary() 참조).
라이브러리를 로드할 때 QLibrary 은 파일 이름에 절대 경로가 없는 한 모든 시스템별 라이브러리 위치(예: Unix의 경우 LD_LIBRARY_PATH
)에서 검색합니다. 라이브러리를 성공적으로 로드한 후 fileName()은 생성자에서 제공되었거나 setFileName()에 전달된 경우 라이브러리의 전체 경로를 포함하여 라이브러리의 정규화된 파일 이름을 반환합니다.
예를 들어, Unix 플랫폼에서 "GL" 라이브러리를 성공적으로 로드한 후 fileName()은 "libGL.so"를 반환합니다. 파일 이름이 원래 "/usr/lib/libGL"로 전달된 경우, fileName()은 "/usr/lib/libGL.so"를 반환합니다.
함수에 액세스합니다:
QString | fileName() const |
void | setFileName(const QString &fileName) |
loadHints : LoadHints
load() 함수에 동작 방식에 대한 힌트를 제공하세요.
심볼이 어떻게 확인되는지에 대한 힌트를 제공할 수 있습니다. 일반적으로 심볼은 로드 시점에 확인되지 않고 느리게 확인됩니다(즉, resolve()가 호출될 때). loadHints를 ResolveAllSymbolsHint 로 설정하면 플랫폼에서 지원하는 경우 모든 심볼이 로드 시점에 확인됩니다.
ExportExternalSymbolsHint 으로 설정하면 라이브러리의 외부 심볼을 이후에 로드된 라이브러리에서 확인할 수 있습니다.
LoadArchiveMemberHint 을 설정하면 파일 이름은 두 가지 구성 요소로 구성됩니다: 아카이브 파일에 대한 참조인 경로와 아카이브 멤버에 대한 참조인 두 번째 구성 요소입니다. 예를 들어 fileName libGL.a(shr_64.o)
은 libGL.a
이라는 이름의 아카이브 파일에서 shr_64.o
라이브러리를 참조합니다. 이는 AIX 플랫폼에서만 지원됩니다.
로드 힌트의 해석은 플랫폼에 따라 다르며, 이를 사용하는 경우 컴파일하는 플랫폼에 대해 몇 가지 가정을 하고 있을 수 있으므로 그 결과를 이해하는 경우에만 사용하세요.
기본적으로 이러한 플래그는 설정되어 있지 않으므로 라이브러리는 지연 심볼 해상도로 로드되며 다른 동적으로 로드된 라이브러리에서 해상도를 위해 외부 심볼을 내보내지 않습니다.
참고: 힌트는 이 개체가 파일과 연결되지 않은 경우에만 지울 수 있습니다. 힌트는 파일 이름이 설정된 후에만 추가할 수 있습니다(hints 은 이전 힌트와 함께 또는'로 바뀝니다).
참고: 라이브러리가 로드된 후에 이 속성을 설정하면 아무런 효과가 없으며 loadHints()에 해당 변경 사항이 반영되지 않습니다.
참고: 이 속성은 동일한 라이브러리를 참조하는 모든 QLibrary 인스턴스 간에 공유됩니다.
함수에 액세스합니다:
QLibrary::LoadHints | loadHints() const |
void | setLoadHints(QLibrary::LoadHints hints) |
멤버 함수 문서
[explicit]
QLibrary::QLibrary(QObject *parent = nullptr)
주어진 parent 로 라이브러리를 구축합니다.
[explicit]
QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)
fileName 에 지정된 라이브러리를 로드하는 지정된 parent 으로 라이브러리 객체를 생성합니다.
fileName 에서 파일 접미사는 생략하는 것이 좋습니다. QLibrary는 플랫폼에 따라 적절한 접미사를 가진 파일을 자동으로 찾기 때문입니다(예: Unix에서는 ".so", macOS 및 iOS에서는 ".dylib", Windows에서는 ".dll"). ( fileName 참조)
[explicit]
QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
fileName 으로 지정된 라이브러리와 전체 버전 번호 version 를 로드하는 라이브러리 객체를 지정된 parent 로 구성합니다. 현재 Windows에서는 버전 번호가 무시됩니다.
fileName 에서 파일 접미사를 생략하는 것이 좋습니다. QLibrary는 플랫폼에 따라 적절한 접미사를 가진 파일을 자동으로 찾습니다(예: Unix에서는 ".so", macOS 및 iOS에서는 ".dylib", Windows에서는 ".dll"). ( fileName 참조)
[explicit]
QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
fileName 으로 지정된 라이브러리와 주 버전 번호 verNum 로 지정된 라이브러리를 로드하는 라이브러리 객체를 parent 로 생성합니다. 현재 Windows에서는 버전 번호가 무시됩니다.
fileName 에서 파일 접미사를 생략하는 것이 좋습니다. QLibrary는 플랫폼에 따라 적절한 접미사를 가진 파일(예: Unix에서는 ".so", macOS 및 iOS에서는 ".dylib", Windows에서는 ".dll"을 자동으로 찾습니다. ( fileName 참조)
[virtual noexcept]
QLibrary::~QLibrary()
QLibrary 객체를 삭제합니다.
unload()가 명시적으로 호출되지 않는 한, 라이브러리는 애플리케이션이 종료될 때까지 메모리에 남아 있습니다.
isLoaded() 및 unload()도 참조하세요 .
QString QLibrary::errorString() const
마지막으로 발생한 오류에 대한 설명이 포함된 텍스트 문자열을 반환합니다. 현재는 load(), unload() 또는 resolve()가 어떤 이유로 실패한 경우에만 errorString이 설정됩니다.
[static]
bool QLibrary::isLibrary(const QString &fileName)
fileName 에 로드 가능한 라이브러리에 유효한 접미사가 있으면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
플랫폼 | 유효한 접미사 |
---|---|
Windows | .dll , .DLL |
Unix/Linux | .so |
AIX | .a |
HP-UX | .sl , .so (HP-UXi) |
macOS 및 iOS | .dylib , .bundle , .so |
Unix의 후행 버전 번호는 무시됩니다.
bool QLibrary::isLoaded() const
load()이 성공하면 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
load()도 참조하십시오 .
bool QLibrary::load()
라이브러리를 로드하고 라이브러리가 성공적으로 로드된 경우 true
을 반환하고 그렇지 않으면 false
을 반환합니다. resolve ()는 항상 기호를 확인하기 전에 이 함수를 호출하므로 명시적으로 호출할 필요는 없습니다. 일부 상황에서는 라이브러리를 미리 로드하고 싶을 수 있으며, 이 경우 이 함수를 사용할 수 있습니다.
unload()도 참조하세요 .
QFunctionPointer QLibrary::resolve(const char *symbol)
내보낸 심볼의 주소를 반환합니다 symbol. 필요한 경우 라이브러리가 로드됩니다. 심볼을 확인할 수 없거나 라이브러리를 로드할 수 없는 경우 nullptr
을 반환합니다.
예:
typedef int (*AvgFunction)(int, int); AvgFunction avg = (AvgFunction) library->resolve("avg"); if (avg) return avg(5, 8); else return -1;
심볼은 라이브러리에서 C 함수로 내보내야 합니다. 즉, 라이브러리가 C++ 컴파일러로 컴파일되는 경우 함수를 extern "C"
로 래핑해야 합니다. 또한 Windows에서는 __declspec(dllexport)
컴파일러 지시문을 사용하여 DLL에서 함수를 명시적으로 내보내야 합니다(예: 컴파일러 지시문):
extern "C" MY_EXPORT int avg(int a, int b) { return (a + b) / 2; }
MY_EXPORT
으로 정의된 경우
#ifdef Q_OS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, const char *symbol)
이 함수는 오버로드된 함수입니다.
라이브러리 fileName 를 로드하고 내보낸 심볼의 주소 symbol 를 반환합니다. fileName 에는 플랫폼별 파일 접미사가 포함되어서는 안 됩니다( fileName 참조). 라이브러리는 애플리케이션이 종료될 때까지 로드된 상태로 유지됩니다.
심볼을 확인할 수 없거나 라이브러리를 로드할 수 없는 경우 nullptr
을 반환합니다.
resolve()도 참조하세요 .
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)
이 함수는 오버로드된 함수입니다.
전체 버전 번호 version 로 라이브러리 fileName 를 로드하고 내보낸 심볼의 주소 symbol 를 반환합니다. fileName 에는 플랫폼별 파일 접미사가 포함되어서는 안 됩니다( fileName 참조). 라이브러리는 애플리케이션이 종료될 때까지 로드된 상태로 유지됩니다. version 은 Windows에서 무시됩니다.
심볼을 확인할 수 없거나 라이브러리를 로드할 수 없는 경우 이 함수는 nullptr
을 반환합니다.
resolve()도 참조하십시오 .
[static]
QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)
이 함수는 오버로드된 함수입니다.
주요 버전 번호가 verNum 인 라이브러리 fileName 를 로드하고 내보낸 심볼의 주소 symbol 를 반환합니다. fileName 에는 플랫폼별 파일 접미사가 포함되어서는 안 됩니다( fileName 참조). 라이브러리는 애플리케이션이 종료될 때까지 로드된 상태로 유지됩니다. verNum 은 Windows에서 무시됩니다.
심볼을 확인할 수 없거나 라이브러리를 로드할 수 없는 경우 이 함수는 nullptr
을 반환합니다.
resolve()도 참조하십시오 .
void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &version)
fileName 속성 및 정식 버전 번호를 각각 fileName 및 version 로 설정합니다. version 매개 변수는 Windows에서 무시됩니다.
setFileName()도 참조하세요 .
void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)
fileName 속성 및 주 버전 번호를 각각 fileName 및 versionNumber 로 설정합니다. versionNumber 은 Windows에서 무시됩니다.
setFileName()도 참조하세요 .
bool QLibrary::unload()
라이브러리를 언로드할 수 있으면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
이 함수는 애플리케이션 종료 시 자동으로 수행되므로 일반적으로 이 함수를 호출할 필요가 없습니다.
QLibrary 의 다른 인스턴스가 동일한 라이브러리를 사용하는 경우 호출이 실패하고 모든 인스턴스가 unload()를 호출한 경우에만 언로드가 수행됩니다.
macOS에서는 동적 라이브러리를 언로드할 수 없습니다. QLibrary::unload()는 true
를 반환하지만 라이브러리는 프로세스에 로드된 상태로 유지됩니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.