合計 昨日 今日

「shared library」とDLL

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: さまよい
[URL]
Date: 2018年1月01日(月) 11:25
No: 1
(OFFLINE)

 「shared library」とDLL

LINUX系の「shared library」がWindowsのDLLに相当だと聞いておりますが、
DLLの場合実行ファイル生成する時に何の情報も無くても良いですが、
「shared library」もそうでしょうか。
要は「shared library」もDLLのように(実行する時に)「動的」提供すれば良いのでしょうか

宜しくお願いします

Name: かずま
[URL]
Date: 2018年1月01日(月) 11:35
No: 2
(OFFLINE)

 Re: 「shared library」とDLL

質問です。「Linux shared library」で検索せずに、
この掲示板で質問するのは、なぜですか?

Name: さまよい
[URL]
Date: 2018年1月09日(火) 13:45
No: 3
(OFFLINE)

 Re: 「shared library」とDLL

かずまさま

大変お世話になっております。
貴重なご教授熱く御礼申し上げます。

>「Linux shared library」で検索せずに、,,,なぜですか?
当然、検索しました。
基本は英語で、あれこれ書いたけれども、
あたしの2点の質問に単純明快に答えてくれるのが見つけられませんでした!

Name: Math
[URL]
Date: 2018年1月09日(火) 18:01
No: 4
(OFFLINE)

Name: かずま
[URL]
Date: 2018年1月10日(水) 16:19
No: 5
(OFFLINE)

 Re: 「shared library」とDLL

さまよい さんが書きました:LINUX系の「shared library」がWindowsのDLLに相当だと聞いておりますが、
DLLの場合実行ファイル生成する時に何の情報も無くても良いですが、

DLL の場合、実行ファイルを生成する時に情報を
与えることもできるし、与えないこともできます。

shared library の場合も同様です。

まずは、Windows の DLL からです。

sum.c
コード[C]: 全て選択
1
2
3
4
5
__declspec(dllexport)
int sum(int n)
{
    return n * (n+1) / 2;
}

sum.dll を作ります。
コード[Text]: 全て選択
1
cl /LD sum.c

sum.lib と sum.exp もできます。

実行ファイルを生成するときに、インポートライブラリの
sum.lib を使うやり方と、そうでないやり方があります。

main.c
コード[C]: 全て選択
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int sum(int);
 
int main(void)
{
    printf("sum(10) = %d\n", sum(10));
}

コンパイル時に sum.lib を指定する。
コード[Text]: 全て選択
1
2
3
C:\tmp\DLL>cl main.c sum.lib
C:\tmp\DLL>main
sum(10) = 55


main2.c
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <windows.h> // HINSTANCE, LoadLibray, GetProcAddress, FreeLibrary
 
int sum(int);
 
int main(void)
{
    int (*sum)(int);
    HINSTANCE h = LoadLibrary("sum.dll");
    if (!h) return 1;
    sum = (int (*)(int))GetProcAddress(h, "sum");
    if (!sum) return 2;
    printf("sum(9) = %d\n", sum(9));
    FreeLibrary(h);
}

コンパイル時に sum.lib を指定しない。
コード[Text]: 全て選択
1
2
3
C:\tmp\DLL>cl main2.c
C:\tmp\DLL>main
sum(9) = 45


次に Linux の場合です。
sum.c
コード[C]: 全て選択
1
2
3
4
int sum(int n)
{
    return n * (n + 1) / 2;
}

sum.so を作ります。
コード[Text]: 全て選択
1
gcc -shared -o sum.so sum.c


main.c
コード[C]: 全て選択
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int sum(int);
 
int main(void)
{
    printf("sum(10) = %d\n", sum(10));
}

コンパイル時に sum.so を指定する。
コード[Text]: 全て選択
1
2
3
4
$ gcc -o main main.c sum.so
$ export LD_LIBRARY_PATH=.
$ ./main
sum(10) = 55


main2.c
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <dlfcn.h>  // dlopen, dlsym, dlclose, RTLD_LAZY
 
int main(void)
{
    int (*sum)(int);
    void *h = dlopen("sum.so", RTLD_LAZY);
    if (!h) return 1;
    sum =  dlsym(h, "sum");
    if (!sum) return 2;
    printf("sum(9) = %d\n", sum(9));
    dlclose(h);
}

コンパイル時に sum.so を指定しない。
コード[Text]: 全て選択
1
2
3
4
$ gcc -o main2 main2.c -ldl
$ export LD_LIBRARY_PATH=.
$ ./main2
sum(9) = 45

Name: さまよい
[URL]
Date: 2018年1月10日(水) 21:40
No: 6
(OFFLINE)

 Re: 「shared library」とDLL

[解決!]

かずまさま、Mathさま
よくわかりました!
ありがとうございました。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[17人]