Создание динамической библиотеки, это правильный путь?

193
Nebbs

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

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
grawity

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

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

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

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