Linuxでクロスコンパイル 〜その1〜

Pocket

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

#include <iostream>

int main(){
std::cout <<“hello ” <<std::endl;
return 0;
}

 

さてコンパイル

$ 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ってこのMobizenかな??

 

クロスコンパイル自体はそりゃ出来るでしょうねって感じでした。

問題はこれにどういうフロントエンドを付けるのかっていうとこなんだけど、というかそもそも鯖にLinuxを使うのかどうかとか、色々決まってない部分があるし、加えて言うなら今回はCっぽい空気だったけど、求められているのはFORTRANなのであった……

 

 

ちなみに

上ではしれっと-static付けているけど、ダイナミックリンクでやるとlibstdc++-6.dllあたりが必要そうなエラーを吐いて実行できない。適切に用意してあげれば実行出来るんだろうけどね。

データの大きさを比べると、

  • test.cpp  84
  • test.exe  11206980
  • test.out  9192
  • test_d.exe 134968

みたいな感じ。スタティックリンクだと11MBくらいになる。(ただのHelloWorldである)

お茶漬け

たまーに飲み屋で食べるお茶漬けめちゃウマい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です