Lazarus（on Windows）でLinuxアプリをコンパイルしようとして諦めた話

## はじめに
[前回](https://qiita.com/KG_/items/fb709125eb5f630493ee)、Windows10上にLazarusをインストールしまして、さぁLinuxアプリをつくってみよう、、、と思ったのですが。。。

結論から言うと、Windows上でLinuxアプリのコンパイルはややこしそうなので一旦諦めることにしました。

私が今回やりたいことは、`Object Pascalで作ったLinuxアプリをマネージドKubernetes上で動かす`なのですが、Windows上でのクロスコンパイルにこだわる必要がないので、あまり深追いはしないでおこうと思ったためです。（Linux環境でLazarusを動かせるみたいなので）

## 経緯
### まず、コンソールアプリケーションのプロジェクトを作成しました。

`File > New...`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/d48d5a2b-6eac-462c-4c89-d0ba1753cf07.png)

`Project > Console application`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/c8bbf833-202e-48f3-8ffc-963d1c18bf23.png)

クラス名とタイトルを適当に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/fe7bc902-1e38-5cfe-f3ab-95a7c7ccd2b1.png)

すると、下のようなコードが自動生成されます。
```pascal
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };

type

  { TSample }

  TSample = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure WriteHelp; virtual;
  end;

{ TSample }

procedure TSample.DoRun;
var
  ErrorMsg: String;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h', 'help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;

  // parse parameters
  if HasOption('h', 'help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;

  { add your program here }

  // stop program loop
  Terminate;
end;

constructor TSample.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  StopOnException:=True;
end;

destructor TSample.Destroy;
begin
  inherited Destroy;
end;

procedure TSample.WriteHelp;
begin
  { add your help code here }
  writeln('Usage: ', ExeName, ' -h');
end;

var
  Application: TSample;
begin
  Application:=TSample.Create(nil);
  Application.Title:='SampleApplication';
  Application.Run;
  Application.Free;
end.
```

### クロスコンパイル（Windows > Linux）の設定
まず、ビルドモードを追加します（今回は`Linux x64 Release`という名前で追加）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/a6c1b954-8cc8-981d-6950-ea5782314ae3.png)

そして、必要な設定（バイナリファイルの出力先をターゲットOSごとに分ける設定や、そもそものターゲットOSの設定など）をおこないます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/b6a72ef3-358e-eca7-22ef-144630ecf486.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/59b89384-ef6e-f8e9-b873-bea0ff06637e.png)

### 謎のエラーが、、、
上述までの設定が終わり、プロジェクトオプションを閉じようとしたら、以下のようなエラーが出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/906516c3-7fe5-080f-96b1-297a8a834310.png)

どうもLinuxをターゲットにコンパイルするには追加の某が必要そうです。

色々調べてるうちに、[こちらのwikiの記事](https://wiki.freepascal.org/Cross_compiling#From_Windows_to_Linux)にあたったのですが、`This is less trivial, there is some info in the buildfaq`とあり、そうかless trivialなのね、と思いながらbuildfaqを参照すると、最終的に[2010年に作成されたpdf](http://www.stack.nl/~marcov/buildfaq.pdf)に行き着き、これは（クロスコンパイル環境を作るのは）骨が折れそうだな、と感じました。

そのため、一旦深追いはやめようと思うに至りました。

## さいごに
おそらく、Windows上でWindowsネイティブアプリを作るにあたってはそれほど難しくはないのかもしれません（知らんけど）。

今回は目的が異なるので深追いは諦めて、次はWSL上のUbuntu環境でLazarusを動かして試してみようと思います（できるかどうかはわからない）。