« Отговор #14 -: Feb 05, 2015, 01:30 »
Че с ffmpeg не идваха ли разни tool-ове, ето ти изпълними файлове значи.
Въпросът е донякъде идеологически, донякъде чисто технически. Идеологически погледнато, код, който няма да се преизползва и е за пред крайния потребител, няма смисъл да се навира в библиотеки, защото е безсмислено, никой няма да ги ползва тези библиотеки на първо време. Код, който се преизползва (например реализацията на някой видео кодек) има логика да бъде реализиран в библиотека с добре дефиниран и документиран интерфейс. На теория, би могло всеки изпълним файл да бъде реализиран като .so библиотека и някой който просто иска да доразшири нещата, примерно mplayer с функция да ти гаси самсунгския телевизор след края на филма, да се линква към библиотеката и да си вика оттам нещата и да ги *донадгражда*. Това даже звучи добре, напомня бледо на уиндоуските COM дивотии дето бяха много модерни по едно време.
Проблемите с това обаче са много. Такъв начин за интерфейсване с наличния код е прекалено....груб така да се каже, всичко ти е в адресното пространство, имаш си символна таблица и динамичен линкер дето ще ти резолвне викането на функции, ще можеш да викаш всяка функция, поне която е в таблицата, static функциите няма да се виждат де. И тук първия проблем - какво става ако не искаш всеки да ти вика функцията примерно? Имаш два варианта - функцията да е static и да не се "вижда" или да не е static и да се "вижда". Ако е static обаче, тя няма да се вижда от други .c файлове от оригиналния проект и това може да е проблем (gcc има магии за целта, ама това да разчиташ на специфично поведение на компилатора е лоша идея, не е portable).
Съвсем отделно, можеш да искаш тази функция да се вика само при много специални условия, които няма как да се проверят ако просто се линкваш към библиотеката, щото там или викаш или не викаш. В конкретната програма може да има много ясен flow, който да изключва тези неща да стават извън тези условия. Когато някой може да вика каквото си иска когато си иска, нямаш гаранции за това и като резултат кодът ще се раздуе с безумни проверки, за да си сигурен че някой идиот не прави каквото не трябва.
Отделно, потребителските програми прекалено често си променят "поведението", не е като някое добре премислено библиотечно API, така нова версия на програмата-библиотека много вероятно ще чупи това дето я ползва. И ще настане един хубав dependency ад, това чат-пат става и сега, но тогава ще е в размери съпоставими с тези от ерата на win98.
Та затова може би не всеки изпълним файл е библиотека (или обратното зависи откъде го гледаш). А иначе и динамичните библиотеки, и изпълнимите файлове използват един и същ ELF формат.