2016-04-08 6 views
0

こんにちは、スタックオーバーフローの良い人に、私は再び質問に戻ってきた! haha 私は、私がコンパイルして一緒にリンクしようとしているファイルをいくつか持っています。私が作成したライブラリはDLLです。 RTLD_LAZYメソッドを使用する。私はアプリケーションと同じディレクトリにライブラリを持っています。私はこの仕事を完了するのに苦労している。私は-ldlを使ってリンクしようとしています。メイクファイルを使用したダイナミックリンクライブラリ

私がしているしている私のファイル:ここで

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 

は、私がこれまでにやっていることですが、私は明らかにアップ何かをねじ込むだが...

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=./ 

何かアドバイスは大歓迎されます!前もって感謝します!

+0

はエラーメッセージとtestDynamicのための最小限のソースを与えることができる – dvhh

+1

『私が作成したライブラリはDLL』『libmyLibrary.so』、これは私には少し混乱思わあり、DLLは私を与えます – jdarthenay

+0

共有ライブラリの読み込み中にエラーが発生しました:「libmyLibrary.so:共有オブジェクトファイルを開くことができません:いいえそのようなものです。ファイルまたはディレクトリ@dvhh – rtayl0a

答えて

0

ここでは、自分のメークファイルに近い例があります。

メイクファイル:リンクのみ

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 

使用-lm-fPicは、ダイナミックライブラリをリンクする場合にのみ必要です。 -lmyLibraryは、動的ライブラリとプログラムをリンクする場合にのみ必要です。したがって、testDynamicを生成することは、ライブラリを動的にロードするので、それを必要とせず、リンクされる必要はありません。

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 
:今建物

#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 

:再び

#include <stdio.h> 
#include <stdlib.h> 

void sdv_print_version() 
{ 
    printf("v2.0\n"); 
} 

ビルド:

>mkdir v1.0 
>mv libmylibrary.so v1.0/ 

は今myLibrary.cを更新:

>mkdir v2.0 
>mv libmylibrary.so v2.0/ 

が利用可能になりましたなし動的ライブラリでテスト:

>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 

違いは何ですか? "testDynamic.c"では、メッセージエラーを表示する代わりに、 "libmyLibrary.so"を必要としない代替アルゴリズムを実行できます。

ここで「libmyLibrary」を使用することができます。そう ":?

>cd v1.0 
>../dynamic 
v1.0 
>../testDynamic 
v1.0 
>cd ../v2.0 
>../dynamic 
v2.0 
>../testDynamic 
v2.0 
関連する問題