2016-04-08 42 views
0

Yığın Taşması'nın iyi insanlarına merhaba, sorulara tekrar cevap veriyorum! haha Bu yüzden derlemeye ve birleştirmeye çalıştığım birkaç dosyam var. Oluşturduğum kitaplık bir DLL dosyasıdır. RTLD_LAZY yöntemini kullanarak. Kütüphane, uygulama ile aynı dizinde var. Bu görevi tamamlarken zor bir zaman geçiriyorum. -ldl kullanarak bağlantı kurmaya çalışıyorum.Makefile kullanarak Dinamik Bağlantı Kitaplığı

İşte
lab3.c  //Which has my main 
myLibrary.c //which is my library 
sdv.h   //which is my header file 
testDynamic.c //which is my handle file for the RTLD_LAZY 

şimdiye kadar yaptıklarını, ama açıkça

dynamic: lab3.o myLibrary.o test 
     gcc -o dynamic lab3.o myLibrary.o -lm 

lab3.o: lab3.c 
     gcc -fPIC -c -o lab3.o lab3.c -lm 

myLibrary.o: myLibrary.c 
     gcc -fPIC -c myLibrary.c -o myLibrary.o -lm 

libmyLibrary.so: myLibrary.o 
     gcc -shared -o libmyLibrary.so myLibrary.o -lm 

testDynamic.o: 
     gcc testDynamic.c -L. -lmyLibrary -o test -ldl 

export LD_LIBRARY_PATH=./ 

Herhangi bir tavsiye büyük takdir edilecektir .. yukarı şey dalga geçtiğimi: Ben

Benim dosyalardır ! Şimdiden teşekkürler!

+0

Eğer testDynamic için hata mesajını ve minimal bir kaynak verebilir misiniz – dvhh

+1

? '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

+0

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

cevap

0

İş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