Jak korzystać z plików DLL innych firm w Visual Studio C++?

Rozumiem, że muszę użyć LoadLibrary (). Ale jakie inne kroki muszę podjąć, aby użyć pliku DLL innej firmy?

Po prostu wskoczyłem do C++ i jest to jedyna część, której nie dostaję (jako programista Java). Zastanawiam się tylko, jak Mogę używać Qt i biblioteki Tesseract-ocr, jednak proces ten nie ma dla mnie sensu i jest tak trudny do wygooglowania.

Jak powiedzieć kompilatorowi o funkcjach, których używam? Czy powinien być plik dołączony z sprzedawca zewnętrzny?

Author: Peter Mortensen, 2009-01-30

6 answers

Jak wszyscy mówią, LoadLibrary jest trudny sposób, aby to zrobić, i prawie nigdy nie jest konieczne.

The DLL should have come with a .plik lib do linkowania i jeden lub więcej plików nagłówkowych do #include w Twoich źródłach. Pliki nagłówkowe zdefiniują klasy i prototypy funkcji, które można użyć z biblioteki DLL. Będziesz tego potrzebować, nawet jeśli używasz LoadLibrary.

Aby połączyć się z biblioteką, być może będziesz musiał dodać .plik lib do konfiguracji projektu pod Linker / Input / Dodatkowe Zależności.

 63
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-30 15:26:24

Aby włączyć biblioteki DLL innych firm do mojego projektu C++ VS 2008 zrobiłem następujące (powinieneś być w stanie przetłumaczyć na 2010, 2012 itp.)...

Umieściłem pliki nagłówkowe w moim rozwiązaniu z innymi plikami nagłówkowymi, wprowadziłem zmiany w kodzie, aby wywoływać funkcje bibliotek DLL (inaczej po co to wszystko robimy?). :^) Potem zmieniłem build, aby połączyć kod LIB z moim EXE, skopiować biblioteki dll na miejsce i wyczyścić je, gdy zrobiłem "clean" - wyjaśniam te zmiany poniżej.

Załóżmy, że masz 2 biblioteki DLL innych firm, A.DLL oraz B.DLL i masz plik stub LIB dla każdego (A. LIB I B. LIB) i pliki nagłówkowe (A. H I B. h).

  • Utwórz katalog" lib " w katalogu rozwiązania, np. używając Eksploratora Windows.
  • skopiuj swoją stronę trzecią .LIB i .Pliki DLL do tego katalogu

(będziesz musiał wprowadzić kolejny zestaw zmian raz dla każdego używanego celu kompilacji źródeł (Debug, Release).)

  1. Uzależnij swój EXE od plików LIB

    • przejdź do Configuration Properties - > Linker - >Input - > Additional Dependencies i wypisz swoje.Pliki LIB pojedynczo oddzielone spacjami : A.LIB B.LIB
    • przejdź do Configuration Properties -> General - > Additional Library Directory i dodaj swój katalog " lib " do dowolnego, który już tam masz. Wpisy są oddzielone średnikami . Na przykład, jeśli masz już $(SolutionDir)fodder tam zmieniasz na $(SolutionDir)fodder;$(SolutionDir)lib aby dodać "lib".
  2. Wymuś skopiowanie bibliotek DLL do katalogu wyjściowego

    • przejdź do Configuration Properties -> Build Events- > post-Build Event
    • umieść w wierszu poleceń (dla znaczenia przełącznika, zobacz " XCOPY/?"w oknie DOS):

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • możesz umieścić coś takiego do opisu:

    Copy DLLs to Target Directory

    • wyłączone z budowy powinny be No. Kliknij OK.
  3. Powiedz VS, aby wyczyścił biblioteki DLL, gdy wyczyści folder wyjściowy:

    • przejdź do właściwości konfiguracyjne - > ogólne - > rozszerzenia, aby usunąć po wyczyszczeniu, i kliknij "..."; dodaj *.dll na koniec listy i kliknij OK.
 59
Author: rich p,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-05 21:23:32

Są dwa sposoby użycia pliku DLL w systemie Windows:

  1. Istnieje Biblioteka stub (.lib) z powiązanymi plikami nagłówkowymi. Gdy połączysz swój plik wykonywalny z plikiem lib, automatycznie załaduje on plik DLL podczas uruchamiania programu.

  2. Ręczne ładowanie biblioteki DLL. Jest to zazwyczaj to, co chcesz zrobić, jeśli opracowujesz system wtyczek, w którym istnieje wiele plików DLL implementujących wspólny interfejs. Sprawdź dokumentację dla LoadLibrary i GetProcAddress aby uzyskać więcej informacji na ten temat.

Dla Qt podejrzewałbym, że są dostępne nagłówki i statyczna biblioteka, które możesz dołączyć i połączyć w swoim projekcie.

 24
Author: Laserallan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 12:34:51

Aby używać Qt z dynamicznym linkowaniem należy podać pliki lib (zazwyczaj qtmaind.lib, QtCored4.lib i QtGuid4.lib dla konfiguracji "Debug") w
Properties » Linker » Input » Additional Dependencies.

Musisz również określić ścieżkę, w której znajdują się libs, czyli w
Properties » Linker » General » Additional Library Directories.

I musisz sprawić, aby odpowiednie .dlls były dostępne w czasie wykonywania, przechowując je w tym samym folderze co .exe lub w folderze, który znajduje się na twojej ścieżce.

 6
Author: drby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 14:50:27

Musisz używać LoadLibrary tylko wtedy, gdy chcesz opóźnić wiązanie i rozwiązać zaimportowane funkcje tylko w czasie wykonywania. Najprostszym sposobem korzystania z biblioteki dll innej firmy jest połączenie z .lib.


W odpowiedzi na Twój edit:

Tak, zewnętrzne API powinno składać się z biblioteki dll i / lub lib, które zawierają implementację i pliki nagłówkowe deklarujące wymagane typy. Musisz znać definicje typów niezależnie od metody, której używasz - dla LoadLibrary musisz zdefiniować funkcję wskaźniki, dzięki czemu można równie łatwo napisać własny plik nagłówka. Zasadniczo wystarczy użyć LoadLibrary, jeśli chcesz późnego wiązania. Jednym z ważnych powodów tego byłoby, jeśli nie jesteś pewien, czy dll będzie dostępny na komputerze docelowym.

 3
Author: Stu Mackellar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-30 15:22:52

I 'if you' re supposed to be able to use it, then 3rd-party library should have a *.plik lib oraz*.plik dll. Wystarczy dodać *.lib do listy plików wejściowych w opcjach 'Linker' twojego projektu.

To *.plik lib niekoniecznie jest biblioteką "statyczną" (zawierającą kod): zamiast tego *.lib może być tylko plikiem, który łączy plik wykonywalny z biblioteką DLL.

 2
Author: ChrisW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-30 15:08:50