1

Я пытаюсь научиться создавать статические и динамические библиотеки, и у меня возникла небольшая проблема с пониманием моего учителя относительно библиотек. Моя идея создания динамической библиотеки заключается в следующем:

gcc -c main.c -o main.o
gcc -c -fPIC func.c -o func.o
gcc -shared -Wl,-soname,-libfunc.so.1 -o libfunc.so.1.0.1 func.o
ldconfig -n .
ln -sf libfunc.so.1.0.1 libfunc.so
gcc main.o libfunc.so.1.0.1 -o prog1
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

Теперь мой учитель говорит, что строка до последнего должна выглядеть так:

gcc main.o -o prog1 -L. -lfunc

Может кто-нибудь объяснить мне точную разницу между этими двумя? Спасибо!

1 ответ1

1

-l<name> - это всего лишь ярлык с надписью «ищите lib<name>.so или lib<name>.a в настроенных путях к библиотекам» и -L. просто добавляет текущий каталог к указанному пути.

Конечно, -l является предпочтительным при использовании реальных библиотек, так как снимает необходимость знать полный путь библиотеки , ни различные ОС детали (например , .so против .dylib против .a против .dll но не должно быть никакой разницы когда исполняемый файл выводится.

$ gcc -o out1 main.c libtest.so
$ gcc -o out2 main.c -L. -ltest
$ md5sum out*
b1b8f46bf6091377b202df90d6bd32cc  out1
b1b8f46bf6091377b202df90d6bd32cc  out2

Смотрите страницу руководства ld для более подробного описания как -l и -L .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .