Qt Creator 프로젝트에 외부 라이브러리 추가


112

Qt Creator RC1 (버전 0.9.2)에서 빌드 한 프로젝트에 외부 라이브러리를 추가하려면 어떻게해야합니까? 예를 들어 빌드 할 프로젝트에 win32 함수 를 추가 EnumProcesses()해야 Psapi.lib합니다.

답변:


216

이를 수행하는 적절한 방법은 다음과 같습니다.

LIBS += -L/path/to -lpsapi

이렇게하면 Qt가 지원하는 모든 플랫폼에서 작동합니다. 아이디어는 라이브러리 이름에서 디렉토리를 분리해야한다는 것입니다 (확장자없이 'lib'접두사없이). 물론 Windows 특정 lib를 포함하는 경우 이것은 실제로 중요하지 않습니다.

프로젝트 디렉토리에 lib 파일을 저장하려면 $$_PRO_FILE_PWD_변수를 사용하여 참조 할 수 있습니다 . 예 :

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

2
환경 변수를 라이브러리 경로로 지정할 수 있습니까? 하드 코딩 된 경로 이름을 .pro 파일에 쓰면 동일한 위치에 모든 라이브러리를 설치하지 않은 여러 사람이 프로젝트를 개발하면 문제가 발생하기 때문에 요청합니다.

이것은 나를 위해 작동했지만를 사용하여 vs 프로젝트를 생성하면 프로젝트 qmake -tp vc에서 libs 이름을 찾지 Additional Dependencies못하지만 vs 프로젝트는 잘 실행됩니다. 추가 할 다른 방법이 있다는 뜻 Additional Dependencies인가요?
Summer Sun

1
기본 제공 Windows 라이브러리의 경로를 지정할 필요가 없다고 생각합니다. .pro 파일에는 win32 섹션에 다음과 같은 줄이 LIBS += -lGdi32있습니다..
Dan Korn

1
@DanKorn이 언급했듯이 내장 Windows 라이브러리의 경우 경로를 지정할 필요가 없으며 지정해서는 안됩니다.
bur

라이브러리 smh를 추가하기 위해 GUI를 만들 수없는 이유는 무엇입니까?
GeneCode

24

qmake프로젝트 를 사용 하고 있습니까? 그렇다면 LIBS변수를 사용하여 외부 라이브러리를 추가 할 수 있습니다 . 예 :

win32:LIBS += path/to/Psapi.lib

1
절름발이 질문으로 미안하지만 psapi 라이브러리가 이미 미리 빌드되어 있거나 QtCreator가 빌드를 처리해야합니까?
Dfr

11

LIBS + = C : \ Program Files \ OpenCV \ lib

Program Files에서 공백을 사용하고 있기 때문에 작동하지 않습니다. 이 경우 따옴표를 추가해야하므로 결과는 다음과 같습니다. LIBS + = "C : \ Program Files \ OpenCV \ lib" . 공백이 아닌 위치에 라이브러리를 배치하는 것이 좋습니다 ;-)


최신 버전의 Qt (Creator)는 항상 (단일) 슬래시를 디렉터리 구분 기호로 사용합니다. 유일한 예외는 Windows에서 "system"명령을 사용하는 경우입니다. 그런 다음 시스템에 이스케이프 된 백 슬래시, 즉 두 개의 백 슬래시를 제공해야합니다. 모든 슬래시를 두 개의 백 슬래시로 바꾸려면 다음과 같이 할 수 있습니다. WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

의미하는 오류는 추가 포함 경로가 누락 되었기 때문입니다. 다음과 같이 추가해보세요. INCLUDEPATH + = C : \ path \ to \ include \ files \ 작동하기를 바랍니다. 문안 인사.


4

여러 라이브러리 파일을 추가하려면 다음과 같이 작성할 수 있습니다.

INCLUDEPATH * = E : / DebugLibrary / VTK E : / DebugLibrary / VTK / Common E : / DebugLibrary / VTK / Filtering E : / DebugLibrary / VTK / GenericFiltering E : / DebugLibrary / VTK / Graphics E : / DebugLibrary / VTK / GUISupport / Qt E : / DebugLibrary / VTK / Hybrid E : / DebugLibrary / VTK / Imaging E : / DebugLibrary / VTK / IO E : / DebugLibrary / VTK / Parallel E : / DebugLibrary / VTK / Rendering E : / DebugLibrary / VTK / Utilities E : / DebugLibrary / VTK / VolumeRendering E : / DebugLibrary / VTK / Widgets E : / DebugLibrary / VTK / Wrapping

LIBS * = -LE : / DebugLibrary / VTKBin / bin / release -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvextkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkzlib -lvtkjpeg -lvtkzlib -lvtkjpeg -lvtkzlib -lvtkjpeg -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

응용 프로그램을 직접 사용하는 대신 고객의 컴퓨터에 응용 프로그램을 배포하려는 경우 LIBS+= -Lxxx -lyyy 경우 문제가 아니라면 방법이 혼란을 초래할 수 있습니다.

우리는 Qt를 사용하여 Linux, Mac 및 Windows 용 애플리케이션을 개발합니다. 완전한 독립형 애플리케이션을 제공합니다. 따라서 모든 비 시스템 라이브러리는 배포 패키지에 포함되어야합니다. 우리는 고객이 모든 OS에 대해 동일한 USB 스틱에서 애플리케이션을 실행할 수 있기를 바랍니다. 플랫폼 호환성을 위해 USB 스틱은 (Linux) 심볼릭 링크를 지원하지 않는 FAT32로 포맷해야합니다.

우리 LIBS+= -Lxxx -lyyy는 블랙 박스 의 관용구를 너무 많이 발견했습니다 .

  1. 링커에서 찾은 (정적 또는 동적) 라이브러리의 파일 경로가 무엇인지 정확히 알 수 없습니다. 이것은 불편합니다. 우리의 Mac 링커는 우리가 사용해야한다고 생각했던 것과 다른 libs를 정기적으로 발견했습니다. 이는 Mac 링커가 요청한 버전이 아닌 이전 버전의 호환되지 않는 OpenSSL 버전을 찾아 사용한 OpenSSL 라이브러리에서 여러 번 발생했습니다.

  2. 링커가 라이브러리에 대한 심볼릭 링크를 사용하면 배포 패키지가 손상 될 수 있으므로 감당할 수 없습니다.

  3. 라이브러리 이름 에서 정적 또는 동적 라이브러리를 연결하는지 확인하려고합니다 .

따라서 우리의 특별한 경우에는 절대 파일 경로 만 사용하고 이들이 존재하는지 확인합니다. 모든 심볼릭 링크를 제거합니다.

먼저 우리가 사용하는 운영 체제를 찾아서 CONFIG 변수에 넣습니다. 예를 들어 Linux 64 비트의 경우 :

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

모든 종속성은 파일 경로를 알고 있으므로 배포 패키지에 복사 할 수 있습니다.


1

완전성을 위해 종속 라이브러리를 찾을 위치에 LIBRARY PATH 만 추가 할 수도 있습니다 (코드에서 직접 참조되지 않을 수 있지만 사용하는 라이브러리에 필요할 수 있음).

비교를 위해 이것은 LIBPATH 환경이 수행하는 작업에 해당하지만 Qt Creator에서는 모호하고 잘 문서화되지 않았습니다.

이 문제를 해결 한 방법은 다음과 같습니다.

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

기본적으로 실제 라이브러리 이름을 제공하지 않으면 종속 라이브러리를 검색 할 경로를 추가합니다. 구문의 차이는 작지만 종속 라이브러리를 찾을 PATH 만 제공하는 데 매우 유용합니다. 때로는 특정 폴더에있는 각 경로 개별 라이브러리를 제공하는 것이 고통스럽고 Qt Creator가이를 선택합니다.


0

.pro에서 : LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

.h / .cpp에서 : #pragma comment(lib,"user32.lib")

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