はじめまして。 S.Taka と申します。
cygwinのライブラリを利用するDLLを作成し,
それをVisual C++ 6.0でコンパイルされるアプリケーション
から利用できるかどうか調べています。
結果としては、リンクまではうまくいくのですが、
プログラムを実行するとアプリケーションエラーが発生して
しまいます。 ただし、cygwinのライブラリを使わずにWin32APIのみを使用するDLLならば動作しました。
やり方が悪いのか、そもそも、そんなことはできないのか
どなたかご存知ないでしょうか?
実験したソース、コンパイル方法、実行結果を以下に書きます。
[testdll.c (cygwin のgccで作成するDLLのソース)]
#include <stdio.h>
void testfunc(void)
{
printf("testfunc\n"); /* MessageBoxとかなら動作する */
}
[testdll.def]
EXPORTS
testfunc
[main.c (VC6でコンパイルするソース)]
#include <stdio.h>
void testfunc(void);
int main()
{
testfunc();
return 0;
}
[ビルドログ]
$ gcc -shared testdll.c -o testdll.dll
$ lib /def:testdll.def
Microsoft (R) Library Manager Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
LIB : warning LNK4068: /MACHINE の指定がありません; IX86 をデフォルトとします
ライブラリ testdll.lib とオブジェクト testdll.exp を作成中
$ cl main.c testdll.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
main.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:main.exe
main.obj
testdll.lib
[結果]
$ ./main
---------------------------
main.exe - アプリケーション エラー
---------------------------
"0x610bd171" の命令が "0x00000108" のメモリを参照しました。メモリが "read" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
プログラムをデバッグするには [キャンセル] をクリックしてください
---------------------------
OK キャンセル
---------------------------
[バージョン]
$ cmd /c ver
Microsoft Windows 2000 [Version 5.00.2195]
$ uname -a
CYGWIN_NT-5.0 HOGE 1.3.12(0.54/3/2) 2002-07-06 02:16 i686 unknown
$ gcc --version
2.95.3-5
$ cl /help
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
...
|