さまよい さんが書きました:LINUX系の「shared library」がWindowsのDLLに相当だと聞いておりますが、
DLLの場合実行ファイル生成する時に何の情報も無くても良いですが、
DLL の場合、実行ファイルを生成する時に情報を
与えることもできるし、与えないこともできます。
shared library の場合も同様です。
まずは、Windows の DLL からです。
sum.c
コード:
__declspec(dllexport)
int sum(int n)
{
return n * (n+1) / 2;
}
sum.dll を作ります。
sum.lib と sum.exp もできます。
実行ファイルを生成するときに、インポートライブラリの
sum.lib を使うやり方と、そうでないやり方があります。
main.c
コード:
#include <stdio.h>
int sum(int);
int main(void)
{
printf("sum(10) = %d\n", sum(10));
}
コンパイル時に sum.lib を指定する。
コード:
C:\tmp\DLL>cl main.c sum.lib
C:\tmp\DLL>main
sum(10) = 55
main2.c
コード:
#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 を指定しない。
コード:
C:\tmp\DLL>cl main2.c
C:\tmp\DLL>main
sum(9) = 45
次に Linux の場合です。
sum.c
コード:
int sum(int n)
{
return n * (n + 1) / 2;
}
sum.so を作ります。
コード:
gcc -shared -o sum.so sum.c
main.c
コード:
#include <stdio.h>
int sum(int);
int main(void)
{
printf("sum(10) = %d\n", sum(10));
}
コンパイル時に sum.so を指定する。
コード:
$ gcc -o main main.c sum.so
$ export LD_LIBRARY_PATH=.
$ ./main
sum(10) = 55
main2.c
コード:
#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 を指定しない。
コード:
$ gcc -o main2 main2.c -ldl
$ export LD_LIBRARY_PATH=.
$ ./main2
sum(9) = 45
[quote="さまよい" id=3,19900,149336]LINUX系の「shared library」がWindowsのDLLに相当だと聞いておりますが、
DLLの場合実行ファイル生成する時に何の情報も無くても良いですが、[/quote]
DLL の場合、実行ファイルを生成する時に情報を
与えることもできるし、与えないこともできます。
shared library の場合も同様です。
まずは、Windows の DLL からです。
sum.c
[code=c]
__declspec(dllexport)
int sum(int n)
{
return n * (n+1) / 2;
}
[/code]
sum.dll を作ります。
[code=text]
cl /LD sum.c
[/code]
sum.lib と sum.exp もできます。
実行ファイルを生成するときに、インポートライブラリの
sum.lib を使うやり方と、そうでないやり方があります。
main.c
[code=c]
#include <stdio.h>
int sum(int);
int main(void)
{
printf("sum(10) = %d\n", sum(10));
}
[/code]
コンパイル時に sum.lib を指定する。
[code=text]
C:\tmp\DLL>cl main.c sum.lib
C:\tmp\DLL>main
sum(10) = 55
[/code]
main2.c
[code=c]
#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);
}
[/code]
コンパイル時に sum.lib を指定しない。
[code=text]
C:\tmp\DLL>cl main2.c
C:\tmp\DLL>main
sum(9) = 45
[/code]
次に Linux の場合です。
sum.c
[code=c]
int sum(int n)
{
return n * (n + 1) / 2;
}
[/code]
sum.so を作ります。
[code=text]
gcc -shared -o sum.so sum.c
[/code]
main.c
[code=c]
#include <stdio.h>
int sum(int);
int main(void)
{
printf("sum(10) = %d\n", sum(10));
}
[/code]
コンパイル時に sum.so を指定する。
[code=text]
$ gcc -o main main.c sum.so
$ export LD_LIBRARY_PATH=.
$ ./main
sum(10) = 55
[/code]
main2.c
[code=c]
#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);
}
[/code]
コンパイル時に sum.so を指定しない。
[code=text]
$ gcc -o main2 main2.c -ldl
$ export LD_LIBRARY_PATH=.
$ ./main2
sum(9) = 45
[/code]