Linuxの上でWindows向けバイナリを吐き出してみるテスト
詳しいことは詳細が決まってから書くけれど、学校で「コンパイルサーバが欲しい」という話を持ちかけられて、そういえばやった事がないのでちょっくらやってみようって感じ。
とにかく取り敢えずで、それらしい感じになれば今回はそれでオッケーという事で。
ArchLinuxの上でWindows向けを吐くぞ!!ゲロロロ
何はともあれインストール
[tea@teaarch ~]$ yaourt -S mingw-w64-gcc [sudo] tea のパスワード: 依存関係を解決しています... 衝突するパッケージがないか確認しています... パッケージ (5) mingw-w64-binutils-2.25.1-1 mingw-w64-crt-4.0.4-1 mingw-w64-headers-4.0.4-1 mingw-w64-winpthreads-4.0.4-1 mingw-w64-gcc-5.2.0-1 合計ダウンロード容量: 136.10 MiB 合計インストール容量: 780.51 MiB 〜以下略
恒例のHello world.
$ cat hello.cpp #includeint main(){ std::cout <<"hello " <<std::endl; return 0; }</blockquote> さてコンパイル $ g++ -o hello.out hello.cpp $ x86_64-w64-mingw32-g++ -o hello.exe hello.cpp -static $ ls hello.cpp hello.exe hello.out実行します。まずは普通のLinux用バイナリ$ ./hello.out hello当然想定通りの結果。よろしい。 次はクロスコンパイルしたWindows向けバイナリ$ ./hello.exe bash: ./test.exe: cannot execute binary file: 実行形式エラー実行できない。良さそう Windowsに移動させるのがめんどかったからwineで実行してみる$ wine ./hello.exe fixme:service:scmdatabase_autostart_services Auto-start service L"Mobizen plugin" failed to start: 2 hello fixme:ole:RemUnknown_QueryInterface No interface for iid {00000019-0000-0000-c000-000000000046}なんかものっそいエラー吐かれたけど一応「hello」は出たし良いとするか((( Mobizenって[この](https://mobizen.jp/)Mobizenかな?? クロスコンパイル自体はそりゃ出来るでしょうねって感じでした。 問題はこれにどういうフロントエンドを付けるのかっていうとこなんだけど、というかそもそも鯖にLinuxを使うのかどうかとか、色々決まってない部分があるし、加えて言うなら今回はCっぽい空気だったけど、求められているのはFORTRANなのであった…… **ちなみに** 上ではしれっと-static付けているけど、ダイナミックリンクでやるとlibstdc++-6.dllあたりが必要そうなエラーを吐いて実行できない。適切に用意してあげれば実行出来るんだろうけどね。 データの大きさを比べると、 * test.cpp 84 * test.exe 11206980 * test.out 9192 * test_d.exe 134968 みたいな感じ。スタティックリンクだと11MBくらいになる。(ただのHelloWorldである)