İşte kendi makefile yakın bir örnek geliyor.
makefile: bağlayan tek
CC=gcc
CFLAGS=-Wall -Wextra -Werror -std=gnu99
.PHONY:all mrproper clean
all:libmyLibrary.so dynamic testDynamic
dynamic:lab3.o
$(CC) $(CFLAGS) -o dynamic lab3.o -L. -lmyLibrary -lm
lab3.o:lab3.c
$(CC) $(CFLAGS) -c -o lab3.o lab3.c
myLibrary.o:myLibrary.c
$(CC) $(CFLAGS) -fPIC -c myLibrary.c -o myLibrary.o
libmyLibrary.so:myLibrary.o
$(CC) $(CFLAGS) -shared -o libmyLibrary.so myLibrary.o -lm
testDynamic.o:testDynamic.c
$(CC) $(CFLAGS) -o testDynamic.o -c testDynamic.c
testDynamic:testDynamic.o
$(CC) $(CFLAGS) -o testDynamic testDynamic.o -ldl
mrproper:clean
rm -f dynamic libmyLibrary.so testDynamic
clean:
rm -f lab3.o myLibrary.o testDynamic.o
kullanın -lm
. -fPic
sadece dinamik kütüphaneyi bağlarken gereklidir. -lmyLibrary
sadece programı dinamik kütüphaneyle bağlarken gereklidir. Bu nedenle, testDynamic
'un oluşturulması, kitaplığı dinamik olarak yükleyeceğinden buna gerek duymaz, buna bağlı olmanız gerekmez.
sdv.h:
#ifndef SDV_H
#define SDV_H
extern void sdv_print_version();
#endif
myLibrary.c:
#include <stdio.h>
#include <stdlib.h>
void sdv_print_version()
{
printf("v1.0\n");
}
testDynamic.c:
>make
gcc -Wall -Wextra -Werror -std=gnu99 -fPIC -c myLibrary.c -o myLibrary.o
gcc -Wall -Wextra -Werror -std=gnu99 -shared -o libmyLibrary.so myLibrary.o -lm
gcc -Wall -Wextra -Werror -std=gnu99 -c -o lab3.o lab3.c
gcc -Wall -Wextra -Werror -std=gnu99 -o dynamic lab3.o -L. -lmyLibrary -lm
gcc -Wall -Wextra -Werror -std=gnu99 -o testDynamic.o -c testDynamic.c
gcc -Wall -Wextra -Werror -std=gnu99 -o testDynamic testDynamic.o -ldl
: Artık bina
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#define MY_LIB "libmyLibrary.so"
#define PRINT_VERSION "sdv_print_version"
int main()
{
void *handle = dlopen(MY_LIB, RTLD_LAZY);
if (handle == NULL)
{
fprintf(stderr, "%s\n", dlerror());
return 1;
}
void (*p_print_version)() = NULL;
p_print_version = dlsym(handle, PRINT_VERSION);
if (p_print_version == NULL)
{
printf("No version available.\n");
fprintf(stderr, "%s\n", dlerror());
}
else
{
(*p_print_version)();
}
if (dlclose(handle) != 0)
{
fprintf(stderr, "%s\n", dlerror());
}
return 0;
}
>make
gcc -Wall -Wextra -Werror -std=gnu99 -fPIC -c myLibrary.c -o myLibrary.o
gcc -Wall -Wextra -Werror -std=gnu99 -shared -o libmyLibrary.so myLibrary.o -lm
en başka bir dizine bu yeni dinamik kütüphane geçelim:
#include <stdio.h>
#include <stdlib.h>
void sdv_print_version()
{
printf("v2.0\n");
}
Yapı yine:
>mkdir v1.0
>mv libmylibrary.so v1.0/
Şimdi myLibrary.c güncellemek:
dinamik kütüphanenin ilk sürümünü tutalım :
>mkdir v2.0
>mv libmylibrary.so v2.0/
Şimdi hiçbir dinamik kütüphane ile test:
>export LD_LIBRARY_PATH=./
>PATH=$PATH:.
>dynamic
dynamic: error while loading shared libraries: libmyLibrary.so: cannot open shared object file: No such file or directory
>testDynamic
libmyLibrary.so: cannot open shared object file: No such file or directory
fark nedir? "TestDynamic.c" de, bir mesaj hatası göstermek yerine, "libmyLibrary.so" gerektirmeyen alternatif bir algoritma yapabilirdik.
Şimdi "libmyLibrary.böylece ":
>cd v1.0
>../dynamic
v1.0
>../testDynamic
v1.0
>cd ../v2.0
>../dynamic
v2.0
>../testDynamic
v2.0
Eğer testDynamic için hata mesajını ve minimal bir kaynak verebilir misiniz – dvhh
? 'diye yarattık kütüphane bu bana biraz kafa karıştırıcı gibi görünüyor, bir DLL' 'libmyLibrary.so' dir, bir DLL bana verir windows için kullandığınız izlenim, ama .so dosyası UNIX için dinamik kitaplıklar, yani tam olarak işletim sisteminiz nedir? – jdarthenay
Hata alıyorum paylaşılan kütüphaneleri yüklerken hata: libmyLibrary.so: paylaşılan nesne dosyasını açamıyor: dosya veya dizin @dvhh – rtayl0a