clang hello.c -o hello -Igreeting
пытается скомпилировать и связать , но вы не указали имя библиотеки для ссылки:
clang hello.c -o hello -Igreeting greeting.so #<= greeting.so added
Затем выдолжен быть в состоянии запустить вывод с:
LD_LIBRARY_PATH=. ./hello
Идея состоит в том, что библиотека будет помещена в один из путей вашей системной библиотеки, а поскольку вы этого не сделали, переменная среды LD_LIBRARY_PATH является своего родавзлома, чтобы заставить его работать без него.
С помощью gcc / clang в Linux вы также можете жестко закодировать полный путь:
clang hello.c -o hello -Igreeting $PWD/greeting.so
или вы можете выполнить динамический компоновщик для поисказависимость относительно расположения исполняемого файла
clang hello.c -o hello -Igreeting '-Wl,-rpath=$ORIGIN' greeting.so
С помощью любого из двух указанных выше методов вам больше не нужна часть LD_LIBRARY_PATH=.
.
В динамических библиотеках гораздо большеи я рекомендую вам изучить их подробнее, например, из DSO Howto рецензии Ульриха Дреппера.