2011-01-05 8 views
56

Właśnie odkryłem, że flaga -lm jest potrzebna gcc, aby skompilować program, który odwołuje się do funkcji z biblioteki matematycznej. Zastanawiam się, dlaczego wyraźna flaga linkowania nie jest potrzebna podczas kompilowania programów zawierających inne biblioteki, takie jak biblioteka czasu. Jeśli napiszę program, w którym wywoływana jest funkcja time(), kompiluje się bez problemów, nawet bez opcji łączenia. Ale program z włączoną biblioteką matematyczną nie zadziała bez flagi -lm.gcc: dlaczego flaga -lm jest potrzebna do połączenia biblioteki matematycznej?

Czy ktoś może wyjaśnić przyczynę tego zachowania? Dziękuję za Twój czas.

+4

Dziwne względy historyczne, ale głównie dlatego, że tak to jest: http://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c – birryree

Odpowiedz

32

Ponieważ time() i niektóre inne funkcje są builtin zdefiniowany w bibliotece C (libc) sama i GCC zawsze linki do libc chyba użyć opcji kompilacji -ffreestanding. Jednak funkcje matematyczne są dostępne w postaci libm, która nie jest niejawnie połączona z gcc.

+4

On LLVM gcc Nie muszę dodawać -lm. Dlaczego to? –

55

Z powodu absurdalnej praktyki historycznej, której nikt nie chce naprawić. Konsolidacja wszystkich funkcji wymaganych przez C i POSIX w pojedynczy plik biblioteki nie tylko pozwoliłaby uniknąć niejednokrotnego zadawania tego pytania, ale także zaoszczędziłaby znaczną ilość czasu i pamięci podczas dynamicznego łączenia, ponieważ każdy powiązany plik .so wymaga systemu plików operacje, aby zlokalizować i odnaleźć go, a kilka stron dla swoich zmiennych statycznych, delokalizacji itp

implementacja gdzie wszystkie funkcje są w jednej bibliotece i -lm, -lpthread, -lrt itp opcje są wszystkie no-ops (lub link do pustych plików .a) jest doskonale zgodny z POSIX i na pewno lepszy.

Uwaga: mówię o POSIX, ponieważ sam C nie określa nic na temat wywoływania kompilatora. Zatem można traktować gcc -std=c99 -lm jako sposób implementacji kompilatora, który musi być wywoływany dla zachowania zgodnego.

+8

+1 za wskazanie, że POSIX nie wymaga oddzielnych bibliotek libm, libc i librt. Na przykład w systemie Mac OS wszystko znajduje się w jednym libSystem (który obejmuje także libdbm, libdl, libgcc_s, libinfo, libm, libpoll, libproc i librpcsvc). –

+3

-1 do spekulowania na temat wpływu biblioteki na wydajność bez tworzenia kopii zapasowej za pomocą łącza lub liczb. "Profil, nie spekuluj" –

+7

To nie jest spekulacja. Nie mam żadnych opublikowanych artykułów, ale sam wykonałem wszystkie pomiary i różnica jest ogromna. Po prostu użyj 'strace' z jedną z opcji taktowania, aby zobaczyć, ile czasu uruchamiania poświęca się na dynamiczne łączenie, lub porównaj działające'./Configure' w systemie, w którym wszystkie standardowe narzędzia są połączone statycznie z tym, w którym są dynamiczne -połączony. Nawet główni twórcy aplikacji komputerowych i integratorzy systemów są świadomi kosztów dynamicznego łączenia; dlatego istnieją takie rzeczy jak prelinkowanie. Jestem pewien, że możesz znaleźć benchmarki w niektórych z tych artykułów. –

Powiązane problemy