2023年12月27日水曜日

WSLでWindows実行ファイルを作るまでの地味な道のり(2)

WSLでMinGWを使って、C言語で32bitおよび64bitのWindows実行ファイルを作るっていう、もうあっちこっちで復習が繰り返されているテーマを敢えて復習してみる。

前回作成したdllをテストするための実行ファイルを作ります。

test.c
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <windows.h>
  4.  
  5. typedef uint32_t (__stdcall *keisan_type)(uint32_t a,uint32_t b);
  6. HMODULE dll;
  7. keisan_type keisan;
  8.  
  9. int main(int argc,char** argv){
  10. uint32_t a,b,ans;
  11. dll=LoadLibrary("study1.dll");
  12. keisan=(keisan_type)GetProcAddress(dll,"keisan");
  13. a=2;
  14. b=3;
  15. ans=keisan(a,b);
  16. printf("%d^2 + %d = %d\n",a,b,ans);
  17. return 0;
  18. }
で、これをコンパイルするルールもMakefileに書くって手もあるんだけど、そんなそんな頻繁にいじらないので、直でコンパイルする。
/usr/bin/i686-w64-mingw32-gcc -o test.exe test.c
そして、実行
./test.exe

うまくいったわい。

では、64bitのDLLを作成してみる。いじるのはMakefileだけ。

Makefile_64
  1. TARGETNAME=study1
  2. CC=/usr/bin/x86_64-w64-mingw32-gcc
  3. CXX=/usr/bin/x86_64-w64-mingw32-g++
  4. LINK=/usr/bin/x86_64-w64-mingw32-gcc
  5. CFLAGS= -Wall -c
  6. LFLAGS= -o $(TARGETNAME)_64.dll -shared -static-libgcc -static-libstdc++
  7. OBJS= $(TARGETNAME).o nijo.o tasu.o
  8.  
  9. ALL : $(TARGETNAME)_64.dll
  10.  
  11. $(TARGETNAME)_64.dll : $(OBJS)
  12. $(LINK) $(LFLAGS) $(OBJS) $(TARGETNAME).def
  13.  
  14. .cpp{}.obj :
  15. $(CXX) $(CFLAGS) $<
  16.  
  17. .c{}.obj :
  18. $(CC) $(CFLAGS) $<
  19.  
  20. clean :
  21. rm $(OBJS) $(TARGETNAME)_64.dll
で、Makeするわけだが、-fオプションでMakefile_64を指定するんだけど、一度cleanをしておく。32bitでコンパイルしたオブジェクトを消したいので。
make -f Makefile_64 clean
make -f Makefile_64
で、study1_64.dllができる。

では、これもテストしてみます。

test_64.c
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <windows.h>
  4.  
  5. typedef uint32_t (__stdcall *keisan_type)(uint32_t a,uint32_t b);
  6. HMODULE dll;
  7. keisan_type keisan;
  8.  
  9. int main(int argc,char** argv){
  10. uint32_t a,b,ans;
  11. dll=LoadLibrary("study1_64.dll");
  12. keisan=(keisan_type)GetProcAddress(dll,"keisan");
  13. a=2;
  14. b=3;
  15. ans=keisan(a,b);
  16. printf("%d^2 + %d = %d\n",a,b,ans);
  17. return 0;
  18. }

dllのファイル名を変えただけ。で、直でコンパイルする。
/usr/bin/x86_64-w64-mingw32-gcc -o test_64.exe test_64.c
そして、実行
./test_64.exe

うまくいった。

昔はcygwinでdll作っていたので、cygwin1.dllなしでも動くようにしたかったり、いろいろ勝手がわからなくてあれやこれややってみてたけど、mingwのおかげでだいぶ良くなった。そしてwslのおかげでMSYSが要らなくなったのでそれもだいぶ良くなった。

Visual Studioのライセンス条項がゆるくなってくれると、いわゆる会社でも今よりさらにコンピューティングが盛んになって、生産性が上がるのに、、、じゃぁ会社で買えよってスタンスか、いやプロフェッショナルプログラマーじゃない人もプログラミングする時代なのでなんとかならんもんか。まぁ拙者はマウスポチポチよりも黒い画面に向き合うのが好きなのでwslで満足してますです。

しかし、この手の指南をしているブログとかwebページって最後に「いかがでしたか」とかひどいやつだと「いかがだったでしょうか」とか書いてあるのが多いんだけど、なんでやろ。なんかいいことあんのかな。かすかにイラっとする。なんで、ささいな内容で誰かのためになっているって自信たっぷりなのか。(、、、自分も書いてたりして。)

あんたみたいなの、ろくな老人になれんよって、また、たしなめられる。


0 件のコメント:

コメントを投稿