2012-08-30 14 views
16

Moje tło to C#, ale muszę zachować pewne starsze (MS) C++. W bazie kodu natknąłem się na:C++: Co robi komentarz #pragma (lib, "XXX") z "XXX"?

#pragma comment(lib, "OtherLib700.lib") 

gdzie 700 to jakaś wersja. Poza tym lib jest biblioteką DLL o tej samej nazwie.

Po raz pierwszy pomyślałem, że program będzie zależał od biblioteki DLL, ale po usunięciu go z systemu program nadal działa. Istnieje jednak nowsza wersja biblioteki DLL o nazwie OtherLib900 ...

Wygląda na to, że program "zawarł" kod biblioteki, tak aby nie była już zależna od zewnętrznej biblioteki DLL. (Lub, że program "automatycznie" używa nowszej biblioteki DLL ...)

Która z nich jest poprawna? Czy istnieje sposób na dalsze potwierdzenie tego "założenia"?

+3

Rewizja za przyjęcie błędnej odpowiedzi. – rustyx

Odpowiedz

3

Jeśli program ma tę pragmę, będzie szukał biblioteki OtherLib700.lib. Jeśli jest to biblioteka importu po załadowaniu programu, system Windows wyszuka w ścieżce OtherLib700.dll. Podczas wykonywania nie będzie ona próbowała szukać OtherLib900.dll, więc musi znajdować swój numer dll w innym folderze. Zakłada się, że OtherLib700.lib jest biblioteką importu, a nie biblioteką statyczną. Jeśli OtherLib700 jest biblioteką statyczną, to jest to wszystko, czego potrzebuje.

+0

Tak, normalnie 700 będzie wersją, ale okna będą szukać dokładnego dopasowania i nie będą próbowały ładować wyższej wersji biblioteki o tej samej nazwie. – drescherjm

+0

Skąd będę wiedzieć, czy druga biblioteka jest biblioteką importu czy statyczną? Więc jeśli jest statyczny, jego kod jest zawarty w programie "my"? – steglig

+1

Wierzę, że odpowiedź poniżej opisuje, jak odróżnić: http://stackoverflow.com/questions/6402586/know-if-lib-is-static-or-import – drescherjm

33

To pragma służy do łączenia z określonym plikiem .lib. Jest to alternatywa dla określenia biblioteki w polu zewnętrznych zależności w ustawieniach projektu.

Głównie jest to wykorzystywane do wspierania różnych wersjach:

#ifdef USE_FIRST_VERSION 
#pragma comment(lib, "vers1.lib") 
#else 
#pragma comment(lib, "vers2.lib") 
#endif 

Gdy aplikacja używa dynamicznie połączonej biblioteki, plik lib powie Ci informacje na temat tego, co symbole są eksportowane w dll. Zasadniczo potrzebujesz tylko lib, aby skompilować link &, ale aby uruchomić program, potrzebujesz dll, ponieważ zawiera on cały kod binarny.

Podobno jest powiązany z dll, co zwykle oznacza, że ​​plik lib zawiera tylko informacje o połączeniu i bez kodu. Powinieneś otrzymać błąd czasu wykonania, jeśli nie znaleziono skojarzonego dll. Możesz sprawdzić w MSVS, czy załadowana została inna wersja dll, czy została załadowana z innego miejsca.

+0

* "Potrzebujesz tylko biblioteki do kompilacji i linkowania" * .. więc lib może być jak alternatywa dla pliku nagłówkowego (.h)? – Acidic

-2

Jeśli .lib jest "prawdziwą" biblioteką z rzeczywistym kodem (nigdy nie używałem bibliotek DLL dla systemów dostarczanych przez system, ale uważam, że tworzysz "biblioteki importu" dla własnych bibliotek DLL), to DLL nie jest wymagany.

Jeśli chodzi o temat, komentarz #pragma (lib, xxx) pozwala programom dodawać pewne opcje dla linkera. Może być bardzo użyteczny, aczkolwiek opuściłem kilka opcji, które chciałbym dodać w ten sposób. Podany przykład jest najlepszym przykładem użycia: jeśli plik obiektowy jest zawarty w programie, to dodana zostanie również określona biblioteka.

+2

Co to jest "prawdziwa" biblioteka? –

+0

Myślę, że miał na myśli "statyczną" bibliotekę. – moala

Powiązane problemy