Dodanie zewnętrznej biblioteki do projektu Qt Creator


112

Jak mogę dodać zewnętrzną bibliotekę do projektu zbudowanego przez Qt Creator RC1 (wersja 0.9.2)? Na przykład funkcja win32 EnumProcesses()wymaga Psapi.libdodania do projektu w celu skompilowania.

Odpowiedzi:


216

Właściwy sposób na zrobienie tego wygląda następująco:

LIBS += -L/path/to -lpsapi

W ten sposób będzie działać na wszystkich platformach obsługiwanych przez Qt. Chodzi o to, że musisz oddzielić katalog od nazwy biblioteki (bez rozszerzenia i bez przedrostka „lib”). Oczywiście, jeśli dołączasz bibliotekę specyficzną dla systemu Windows, to naprawdę nie ma znaczenia.

Jeśli chcesz przechowywać pliki lib w katalogu projektu, możesz odwołać się do nich za pomocą $$_PRO_FILE_PWD_zmiennej, np .:

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

2
Czy można określić zmienną środowiskową jako ścieżkę do biblioteki? Pytam, ponieważ zapisanie zakodowanych na stałe nazw ścieżek w pliku .pro zepsułoby sytuację, gdyby projekt był opracowywany przez wiele osób, które mogą nie mieć wszystkich bibliotek zainstalowanych w tych samych lokalizacjach.
antred

To zadziałało dla mnie, ale kiedy generuję projekt vs qmake -tp vc, nie znajduję nazw bibliotek w Additional Dependenciesprojekcie, ale projekt vs działa dobrze. Czy to oznacza, że ​​istnieją inne metody dodawania Additional Dependenciesvs?
Summer Sun,

1
Myślę, że nie musisz określać ścieżki do wbudowanej biblioteki systemu Windows. Nasze .pro pliki mają linie jak to w sekcji win32: LIBS += -lGdi32.
Dan Korn

1
Jak zauważył @DanKorn, dla wbudowanych bibliotek Windows nie musisz (i nie powinieneś) określać ścieżki.
bur

Dlaczego nie mogą po prostu stworzyć GUI, aby dodać bibliotekę smh.
GeneCode

24

Czy korzystasz z qmakeprojektów? Jeśli tak, możesz dodać zewnętrzną bibliotekę za pomocą LIBSzmiennej. Na przykład:

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

1
Przepraszam za kiepskie pytanie, ale czy biblioteka psapi powinna być już gotowa, czy QtCreator zajmie się jej zbudowaniem?
Dfr,

11

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

nie zadziała, ponieważ używasz spacji w Program Files. W takim przypadku musisz dodać cudzysłowy, więc wynik będzie wyglądał następująco: LIBS + = "C: \ Program Files \ OpenCV \ lib" . Zalecam umieszczanie bibliotek w lokalizacjach bez białych znaków ;-)


Najnowsze wersje Qt (Creator) zawsze wymagają (pojedynczych) ukośników jako separatorów katalogów. Jedynym wyjątkiem jest użycie polecenia „system” w systemie Windows. Następnie musisz podać systemowi ucieczkę do tyłu, czyli dwa ukośniki do tyłu. Aby zastąpić wszystkie ukośniki w dwa ukośniki zacofanych można zrobić w następujący sposób: WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

Błąd, który masz na myśli, wynika z braku dodatkowej ścieżki dołączania. Spróbuj dodać go za pomocą: INCLUDEPATH + = C: \ ścieżka \ do \ include \ files \ Mam nadzieję, że zadziała. Pozdrowienia.


4

Aby dodać wiele plików bibliotecznych, możesz napisać jak poniżej:

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 / zwolnić -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkRenderowanie objętości -lQVTKWidgetPlugin -lvtkGenericFiltering


3

Jeśli chcesz wdrożyć aplikację na komputerach klientów, zamiast używać aplikacji tylko samodzielnie, okazuje się, że LIBS+= -Lxxx -lyyymetoda może prowadzić do nieporozumień, jeśli nie problemów.

Tworzymy aplikacje dla systemów Linux, Mac i Windows przy użyciu Qt. Dostarczamy kompletne, samodzielne aplikacje. Dlatego wszystkie biblioteki niesystemowe powinny być uwzględnione w pakiecie wdrożeniowym. Chcemy, aby nasi klienci mogli uruchamiać aplikację z tej samej pamięci USB dla wszystkich systemów operacyjnych. Ze względu na kompatybilność platformy pamięć USB musi zostać sformatowana jako FAT32, który nie obsługuje dowiązań symbolicznych (Linux).

Znaleźliśmy LIBS+= -Lxxx -lyyyidiom za dużo czarnej skrzynki:

  1. Nie wiemy dokładnie, jaka jest ścieżka do (statycznej lub dynamicznej) biblioteki, która została znaleziona przez linker. To jest niewygodne. Nasz linker dla komputerów Mac regularnie znajdował biblioteki inne niż te, które naszym zdaniem powinny być używane. Zdarzyło się to kilka razy z bibliotekami OpenSSL, w których linker Mac znalazł i użył własnej - starszej, niekompatybilnej - wersji OpenSSL zamiast żądanej wersji.

  2. Nie możemy sobie pozwolić na to, aby konsolidator używał dowiązań symbolicznych do bibliotek, ponieważ spowodowałoby to uszkodzenie pakietu wdrożeniowego.

  3. Chcemy zobaczyć na podstawie nazwy biblioteki, czy łączymy bibliotekę statyczną czy dynamiczną.

Dlatego w naszym konkretnym przypadku używamy tylko bezwzględnych ścieżek plików i sprawdzamy, czy istnieją. Usuwamy wszystkie linki symboliczne.

Najpierw dowiadujemy się, jakiego systemu operacyjnego używamy i umieszczamy to w zmiennej CONFIG. Na przykład dla 64-bitowego systemu Linux:

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
}

Wszystkie zależności można skopiować do pakietu wdrożeniowego, ponieważ znamy ich ścieżki plików.


1

Dla kompletności chciałbym dodać, że możesz również dodać tylko ŚCIEŻKĘ BIBLIOTEKI, gdzie będzie szukać zależnej biblioteki (do której może nie odwoływać się bezpośrednio w twoim kodzie, ale biblioteka, której używasz, może jej potrzebować).

Dla porównania, odpowiadałoby to temu, co robi środowisko LIBPATH, ale jego rodzaj jest niejasny w Qt Creator i nie jest dobrze udokumentowany.

Sposób, w jaki to obejrzałem, jest następujący:

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

Zasadniczo, jeśli nie podasz rzeczywistej nazwy biblioteki, doda ścieżkę do miejsca, w którym będzie przeszukiwać biblioteki zależne. Różnica w składni jest niewielka, ale jest to bardzo przydatne, aby podać tylko ŚCIEŻKĘ, gdzie szukać bibliotek zależnych. Czasami po prostu uciążliwe jest dostarczanie każdej ścieżki indywidualnej biblioteki, w której wiesz, że wszystkie znajdują się w określonym folderze, a Qt Creator je odbierze.


0

w .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

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

#pragma comment(lib,"psapi.lib")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.