luca vent
luca vent

Reputation: 71

What is the difference between shared and dynamic libraries in C?

I don't understand the difference between the two types of libraries, and many websites say that they are the same thing, but at school we use two different commands to create them

dynamic library

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -ldl

to execute:

$ ./main ./libsample.so

shared library

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -L. -lsample

to execute:

$ LD_LIBRARY_PATH=. ./main

Can someone help me in understanding the difference between the two "codes"?

Upvotes: 7

Views: 9786

Answers (2)

datenwolf
datenwolf

Reputation: 162299

Dynamic Linked Library (.DLL) is the terminology used by Microsoft Windows. Shared Object (.so) is the terminology used by Unix and Linux.

Other than that, conceptually they're the same.

Regarding your snippets of commands, I guess the difference (and I'm only guessing here, because you didn't show us the relevant parts) is how the library is loaded. There is "link time loading" where the library is tied to the executable by the linker¹. And there is "runtime loading", where the program sort of "ingests" the dynamic/shared library.

runtime loading is done in Windows with the LoadLibrary (there's an …A and a …W variant) function, and on Unix/Linux with dlopen (which is made available by libdl which is linked to by that -ldl library link statement).


1: The linker is the program that creates the actually executable file from the intermediary objects created by the various compiler stages.

Upvotes: 13

Codo
Codo

Reputation: 78905

Dynamic and shared libraries are usually the same. But in your case, it looks as if you are doing something special.

  • In the shared library case, you specify the shared library at compile-time. When the app is started, the operating system will load the shared library before the application starts.

  • In the dynamic libary case, the library is not specified at compile-time, so it's not loaded by the operating system. Instead, your application will contain some code to load the library.

The first case is the normal case. The second case is a special use and it's mainly relevant if your application support extensions such a plug-ins. The dynamic loading is required because there can be many plug-ins and they are built after your application. So their names are not available at compile-time.

Upvotes: 7

Related Questions