Один из способов представить DLL - это контейнер для функций. Экспорт функции из DLL делает эти функции видимыми для вызывающих сторон вне DLL. Хотя экспорт функций из DLL является, пожалуй, наиболее распространенным способом предоставления доступа к ним, многие платформы предоставляют другие способы доступа к функциям, которые не были экспортированы, например, отражение в .NET Framework и Java и (я думаю) LoadLibtary / GetProcAddress в Win32
Причины этого различны, часто потому, что для разработчика полезно иметь функции в библиотеке, но нежелательно, чтобы эти функции вызывались из внешних приложений