コマンドラインアプリ集めとシングルバイナリのビルド
公開日:
カテゴリ: Windows
PATHを通すディレクトリにアプリケーションバイナリをまとめておこうとしたのですが、DLLが邪魔なのでDLLが無くても動くように自力でビルドしてみます。
そもそもDLLって何?
ダイナミックリンクライブラリと呼ばれ、様々なアプリで共通の処理をあらかじめDLLにまとめておき、その処理を実行するときは同じDLLファイルをロードし実行します。そのため同じ処理を様々なアプリで個別に持っているよりも、メモリやファイルサイズの使用量は少なくなります。
ライブラリの共有範囲は様々で、同じアプリの別の実行ファイルで共有するものもあれば、アプリの作者を超えて共有するランタイムと呼ばれるものまであります。もしアプリを実行しようとして〇〇.dll がないため、コードの実行を続行できません。
のようなメッセージを見かけた場合、この共有ライブラリが無くて、処理ができないということです。
- 例1: exeファイルだけをどこか別の場所へ移動して実行しようとしてこのエラーが出た場合は、移動元のフォルダ内にあるDLLが読み込めなくてエラーになっています
- 例2: ダウンロード時にzip形式とインストーラ(exe)形式があってzip形式を選択してこのエラーが出た場合、ランタイムがインストールされていなくてエラーになっています。この場合、インストーラではインストール時にランタイムをセットでインストールしています
ちなみにDLLはWindowsだけですが、LinuxではSO(Shared Object)が同じ働きをします。
このような処理の結合に、DLLを使うものを動的リンク(Dynamic Link)、DLLを使わず自身の実行ファイルに含めるものを静的リンク(Static Link)と呼びます。動的か静的かはビルド時に指定するため、実行ファイル(exeファイル)を作成した後でリンク方式を変更することはできません。
メリットとデメリット
メリット
- DLLがなくなるので、ディレクトリがスッキリする(exeファイルだけのディレクトリとなる)
- バージョンアップなどでライブラリのバージョンアップが上がった場合でも、不要なDLL削除することを考えなくていい
デメリット
- 基本的にトータルのファイル容量は増える
- 特にffmpegとffplayのように、複数アプリでの共通部分が多い場合はファイルサイズが大幅に増加します
- メモリの使用量は増える
- 公式の電子署名は付かない
コマンドラインアプリ集めの準備
あまり環境を汚したくないため、dockerを使います。
docker run --rm -it -v .:/output debian:latest-slim /bin/bash
ビルド不要のアプリ
ビルド済みのDLLなしの実行ファイルが配布されている場合、自力でビルドする意味は薄いので、そのまま配布ファイルをダウンロード・解凍してコピーします。
GitHubのReleaseでバイナリを公開していれば簡単に取得できますが、それ以外はスクレイピングするしか無いので、案外スクリプトを組むのはビルドするより面倒だったりします。
普通にブラウザからダウンロードしてきてもいいですが、ビルドが必要なアプリでこのあと色々コマンドを叩くので、今回はコマンドで取得してきます。
スクレイピングの正規表現が雑なのは気にしない
環境準備
Windows向けのバイナリ配布は大抵のバージョンで扱えるzip形式が多いですが、Linuxではgzipが主流なのでunzip
をインストールします。
apt install -y unzip
7-Zip
7zr.exe
はバイナリ単体で配布されているので簡単です。ただし暗号化ファイルは扱えません。暗号化ファイルを扱いたい場合は7z[0-9]*-extra.7z
の中にある7za.exe
を使うと良いでしょう(7z形式で配布されているので解凍に7-Zipのアーカイバが必要です・・・)。
curl -sS https://api.github.com/repos/ip7z/7zip/releases/latest | jq -r '.assets[] | select(.name | test("^7zr.exe$")) | .browser_download_url' | xargs -I % curl -sSL % > /output/7zr.exe
Biome
こちらもバイナリ単体で配布されているので簡単です。
curl -sS https://api.github.com/repos/biomejs/biome/releases/latest | jq -r '.assets[] | select(.name | test("^biome-win32-x64.exe$")) | .browser_download_url' | xargs -I % curl -sSL % > /output/biome.exe
BusyBox
BusyBoxのWindows向けバージョンです。Unicode版ではない従来版はファイル名のuを削除したURLです。
curl -sSL https://frippery.org/files/busybox/busybox64u.exe > /output/busybox.exe
edit
そのうちWindowsに標準搭載されそうなので、不要になるかもしれません。
curl -sS https://api.github.com/repos/microsoft/edit/releases/latest | jq -r '.assets[] | select(.name | test("^edit-[0-9.]+-x86_64-windows.zip$")) | .browser_download_url' | xargs -I % curl -sSLo edit.zip %
unzip -j edit.zip */edit.exe -d /output
esbuild
ビルド済みのバイナリはnpmにあります。
curl -sS https://registry.npmjs.org/@esbuild/win32-x64/ | jq -r '."dist-tags".latest' | xargs -I % curl -sSLo esbuild.tgz https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-%.tgz
tar -zxvf esbuild.tgz --wildcards -C /output --strip-components=1 '*/esbuild.exe'
ImageMagick
扱いやすいportable版をダウンロードしていますが、ファイル名を変えた同じバイナリが多数存在するためダウンロードサイズが大きいです。筆者はサブコマンド派なのでmagick.exe
以外は使いませんが。。。
curl -sS https://imagemagick.org/archive/binaries/ | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^ImageMagick-[0-9.]*-[0-9]*-portable-Q16-HDRI-x64.zip$/p' | sort -r -V | head -n 1 | xargs -I % curl -sSLo imagemagick.zip https://imagemagick.org/archive/binaries/%
unzip -j imagemagick.zip */magick.exe -d /output
jq
curl -sS https://api.github.com/repos/jqlang/jq/releases/latest | jq -r '.assets[] | select(.name | test("^jq-win64.exe$")) | .browser_download_url' | xargs -I % curl -sSL % > /output/jq.exe
libavif
curl -sS https://api.github.com/repos/AOMediaCodec/libavif/releases/latest | jq -r '.assets[] | select(.name | test("^windows-artifacts.zip$")) | .browser_download_url' | xargs -I % curl -sSLo libavif.zip %
unzip -j libavif.zip avifenc.exe avifdec.exe -d /output
libwebp
使わなさそうなものは外しています。vwebpはfreeglut.dll
が必要です。
curl -sS https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed 's/.*\/\([^\/]*\)/\1/' | sed -r -n '/^libwebp-[0-9.]+-windows-x64\.zip$/p' | sort -r -V | head -n 1 | xargs -I % curl -sSLo libwebp.zip https://storage.googleapis.com/downloads.webmproject.org/releases/webp/%
unzip -j libwebp.zip */cwebp.exe */dwebp.exe */webpinfo.exe */webpmux.exe -d /output
SQLite
公式のダウンロードページに以下の表記があります。
For convenient, script-driven extraction of the downloadable file URLs and associated information, an HTML comment is embedded in this page’s source.
ダウンロードページのHTMLコメントに以下のような最新版のURLとハッシュのCSVリストがあります。
<!-- Download product data for scripts to read
PRODUCT,VERSION,RELATIVE-URL,SIZE-IN-BYTES,SHA3-HASH
PRODUCT,3.50.1,2025/sqlite-src-3500100.zip,14391009,1add4d3c5622f0e33842758d75fc141466f7fbe3f9ea1a85105baf7944ec14e0
PRODUCT,3.50.1,2025/sqlite-amalgamation-3500100.zip,2844807,65e5176c171aff92ff31f3ab4d431a879d648de93f139816f9331a7074859092
PRODUCT,3.50.1,2025/sqlite-autoconf-3500100.tar.gz,3172122,c12e84ba9772391d41644a0a9be37bad25791fc2a9b9395962e5f83f805e877f
PRODUCT,3.50.1,2025/sqlite-preprocessed-3500100.zip,2951788,9e066309b7e781ad7eedcce3fe1bdc68efd5875f5404b3c9b964f032bd54ecde
PRODUCT,3.50.1,2025/sqlite-doc-3500100.zip,11377048,79925842014666f8c006872be5c9b5db3479622cb4d5559dae79275132ea29e1
PRODUCT,3.50.1,2025/sqlite-android-3500100.aar,3575007,3b1a398cb0c82e95afcd24a76f2086608f8f2fd35b4441cf2be59039838fd720
PRODUCT,3.50.1,2025/sqlite-tools-linux-x64-3500100.zip,3384772,1405115a67db60c2ebe6c95ef5578552a01a26968a6f9799291334d87cea32bc
PRODUCT,3.50.1,2025/sqlite-tools-osx-x64-3500100.zip,3721601,58352ee49880019efaba4fc8c6470c3a700e6ddd5e0d56310c64fdfc0cef44df
PRODUCT,3.50.1,2025/sqlite-dll-win-x86-3500100.zip,1074557,fe382cfa167021ad5789907c0afae762c75fa0a3f92fe38e1a456fe6747a36d9
PRODUCT,3.50.1,2025/sqlite-dll-win-x64-3500100.zip,1344522,2bf2afb9a6b94dffcc033f37ebdc50118d0ea9e5536729421efa8fb4eb2a5c5f
PRODUCT,3.50.1,2025/sqlite-tools-win-x64-3500100.zip,6429241,a9b26ca6e415f61ada511a14fb2166c9278de3b471702281dd02f3ce97288cfa
PRODUCT,3.50.1,2025/sqlite-wasm-3500100.zip,812660,5e6ec4a75b4659657f91d88c2932369d19650fd57bc4596b1dcb16106f179b06
-->
このコメントをスクレイピングしてくると簡単に取得できます。
curl -sS https://sqlite.org/download.html | grep "^PRODUCT" | grep "sqlite-tools-win-x64" | awk 'BEGIN {FS=","} {print $3}' | xargs -I % curl -sSLo sqlite.zip https://sqlite.org/%
unzip -j sqlite.zip sqlite3.exe sqldiff.exe sqlite3_analyzer.exe sqlite3_rsync.exe -d /output
手動ビルドするアプリ
基本的にリンカ(LD)のオプションに--static
を付けることで、静的リンクされたDLL無しのバイナリをビルドできます。その他、ファイル容量を小さくするために色々オプションをつけていますが、それらは無くても問題ありません。
環境準備
Docker内のdebianイメージのコンテナで作業するため、ビルド環境はLinuxになります。普通にビルドするとLinuxのアプリケーションがビルドされるので、mingwを使ったクロスコンパイルをするようにビルドを構成していきます。
最低限mingw-w64
とnasm
、多くのアプリでcmake
がビルドに必要です。今回はソースの取得をcurl
で統一していますが、ソースがGitなどで管理されている場合、git
などでも大丈夫です。
apt update
apt install -y mingw-w64 nasm cmake curl jq xz-utils
cd ~
GNU BinUtils
GNUのツール類は最新バージョンを取得する方法が見当たらないので、FTPサイトをスクレイピングしてきます。GNUの公式からソースを落としてくると重いので、JAISTのミラーサーバからダウンロードします。
BinUtilsでは色々なツールがビルドされますが、必要なもののみコピーしています。
curl -sS "https://ftp.jaist.ac.jp/pub/GNU/binutils/?C=M;O=D" | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^binutils-[0-9.]*\.tar.xz$/p' | head -n 1 | xargs -I % curl -sSLo binutils.tar.xz https://ftp.jaist.ac.jp/pub/GNU/binutils/%
mkdir binutils
tar -Jxvf binutils.tar.xz -C binutils --strip-components 1
cd binutils
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --exec-prefix=/usr/bin/x86_64-w64-mingw32- CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4 -s -O2" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s --static"
make
cp -p binutils/.libs/nm-new.exe binutils/.libs/objdump.exe binutils/.libs/strip-new.exe /output
cd ~
GNU DiffUtils
configure時のオプションはそのままではエラーになるので、変数を渡してチェックをスキップさせています。
curl -sS "https://ftp.jaist.ac.jp/pub/GNU/diffutils/?C=M;O=D" | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^diffutils-[0-9.]*\.tar.xz$/p' | head -n 1 | xargs -I % curl -sSLo diffutils.tar.xz https://ftp.jaist.ac.jp/pub/GNU/diffutils/%
mkdir diffutils
tar -Jxvf diffutils.tar.xz -C diffutils --strip-components 1
cd diffutils
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --exec-prefix=/usr/bin/x86_64-w64-mingw32- CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4 -s -O2" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s --static" --enable-threads=windows gl_cv_func_strcasecmp_works=yes
make
cp -p src/diff.exe src/cmp.exe /output
cd ~
GNU make
curl -sS "https://ftp.jaist.ac.jp/pub/GNU/make/?C=M;O=D" | sed -n '/^.*<a.*$/p' | sed -r 's/^.*href="([^"]*)".*$/\1/g' | sed -n '/^make-[0-9.]*\.tar.gz$/p' | head -n 1 | xargs -I % curl -sSLo make.tar.gz https://ftp.jaist.ac.jp/pub/GNU/make/%
mkdir make
tar -zxvf make.tar.gz -C make --strip-components 1
cd make
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --exec-prefix=/usr/bin/x86_64-w64-mingw32- CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4 -s -O2" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s --static"
make
cp -p make.exe /output
cd ~
flac
ビルドにはpkg-configが必要です。oggをサポートする場合、liboggも必要です。
# Pkg-Config
apt install -y pkg-config
# ogg
curl -sS https://api.github.com/repos/xiph/ogg/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo ogg.tar.gz %
mkdir ogg
tar -zxvf ogg.tar.gz -C ogg --strip-components 1
mkdir ogg/build
cd ogg/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s -O2" -DCMAKE_EXE_LINKER_FLAGS=-s ../
make
make install
cd ~
# flac
curl -sS https://api.github.com/repos/xiph/flac/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo flac.tar.gz %
mkdir flac
tar -zxvf flac.tar.gz -C flac --strip-components 1
mkdir flac/build
cd flac/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include -DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s -O2" -DCMAKE_EXE_LINKER_FLAGS=-s -DINSTALL_MANPAGES=OFF ../
make
cp -p objs/flac.exe objs/metaflac.exe /output
cd ~
mozjpeg
ビルドにはzlibとlibpngが必要です。debian系の場合、zlibはパッケージマネージャからインストールできます。
# zlib
apt install -y libz-mingw-w64-dev
# libpng
curl -sS https://sourceforge.net/projects/libpng/best_release.json | jq -r ".platform_releases.linux.url" | xargs -I % curl -sSLo libpng.tar.xz %
mkdir libpng
tar -Jxvf libpng.tar.xz -C libpng --strip-components 1
cd libpng
./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --enable-shared=no CPPFLAGS="-I/usr/x86_64-w64-mingw32/include -march=x86-64-v4" LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -s"
make
make install
cd ~
# mozjpeg
curl -sS https://api.github.com/repos/mozilla/mozjpeg/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo mozjpeg.tar.gz %
mkdir mozjpeg
tar -zxvf mozjpeg.tar.gz -C mozjpeg --strip-components 1
mkdir mozjpeg/build
cd mozjpeg/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include -DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s" -DCMAKE_EXE_LINKER_FLAGS=-s -DENABLE_SHARED=0 -DWITH_ARITH_DEC=1 -DWITH_ARITH_ENC=1 ../
make
cp -p cjpeg-static.exe djpeg-static.exe jpegtran-static.exe rdjpgcom.exe wrjpgcom.exe /output
cd ~
OpenSSL
ビルドスクリプトがPerl製のため、Perlが必要です。ビルドにかかる時間は長めです。
# Perl
apt install -y perl
# OpenSSL
curl -sS https://api.github.com/repos/openssl/openssl/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo openssl.tar.gz %
mkdir openssl
tar -zxvf openssl.tar.gz -C openssl --strip-components 1
cd openssl
./Configure --prefix=/usr/x86_64-w64-mingw32 --cross-compile-prefix=/usr/bin/x86_64-w64-mingw32- -static mingw64
make
# シンボル情報の削除(サイズ削減が目的のためやらなくてもOK)
x86_64-w64-mingw32-strip -s apps/openssl.exe
cp -p apps/openssl.exe /output
cd ~
PCRE2 Grep
curl -sS https://api.github.com/repos/PCRE2Project/pcre2/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo pcre2.tar.gz %
mkdir pcre2
tar -zxvf pcre2.tar.gz -C pcre2 --strip-components 1
mkdir pcre2/build
cd pcre2/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s" -DCMAKE_EXE_LINKER_FLAGS=-s ../
make
cp -p pcre2grep.exe /output
cd ~
QPDF
クロスコンパイルは想定されていないようで、色々オプションを指定して回避しています。
libjpegが必要ですが、上でmozjpegがビルド済みであれば、mozjpegでmake install
するだけでOKです。
PowerShellが無いので途中のテストでビルドがコケますが、QPDF自体はビルドできているので良しとします。
curl -sS https://api.github.com/repos/qpdf/qpdf/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo qpdf.tar.gz %
mkdir qpdf
tar -zxvf qpdf.tar.gz -C qpdf --strip-components 1
mkdir qpdf/build
cd qpdf/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include -DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-s" -DCMAKE_CXX_FLAGS="-s -O2" -DCMAKE_EXE_LINKER_FLAGS="-s --static" -DBUILD_SHARED_LIBS=OFF -DZLIB_LIB_PATH=/usr/x86_64-w64-mingw32/lib/libz.a ../
find | grep link.txt | xargs -I % sed -i 's@CRT_glob.o@/usr/x86_64-w64-mingw32/lib/CRT_glob.o@' %
make
cp -p qpdf/qpdf.exe /output
cd ~
zopflipng
curl -sS https://api.github.com/repos/google/zopfli/releases/latest | jq -r ".tarball_url" | xargs -I % curl -sSLo zopfli.tar.gz %
mkdir zopfli
tar -zxvf zopfli.tar.gz -C zopfli --strip-components 1
mkdir zopfli/build
cd zopfli/build
cmake -G"Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 -DCMAKE_C_FLAGS="-march=x86-64-v4 -s -O2" -DCMAKE_EXE_LINKER_FLAGS=-s ../
make
cp -p zopfli.exe zopflipng.exe /output
cd ~
ffmpeg
ビルドに非常に時間がかかり、かつオプションも非常に複雑なため、今回の方法ではなく以下のようなスクリプトを使用したほうが簡単です。
GitHub - rdp/ffmpeg-windows-build-helpers
おわり
exeファイルだけが並んでいるのは壮観ですが、ただの自己満足、にしか見えませんね・・・w
資料
最新リリースのソースを取得する方法
GitHubではReleasesのlatestを指定してデータを取得する認証不要のAPIがあるので、その結果JSONをパースするのがお手軽です。ソースコードはassetsとして上がっていればそちらでもいいですが、tarball_url
が全プロジェクト共通で使え、圧縮形式も同じためそちらの方が便利です(git clone
を使ってもいいですが、どのみち最新リリースのタグ検索が必要なので今回はこの方法で)。
ソースファイルのダウンロード時はリダイレクトが挟まるので、curlの場合-L
オプションが必須です。
curl -sS https://api.github.com/repos/<user>/<repository>/releases/latest | jq ".tarball_url" | xargs -I % curl -sSLo <name>.tar.gz %
SourceForgeにも一応最新のリリース取得の認証不要APIがあります。ただし、1つのプロジェクト内に複数のアプリがリリースされている場合、全アプリの中で最新のものが出てくるので、このAPIの内容にあまり過度な期待はできません。。。
こちらもソースファイルのダウンロード時はリダイレクトが挟まるので、curlは-L
オプションが必須です。
curl -sS https://sourceforge.net/projects/<project>/best_release.json | jq -r ".platform_releases.linux.url" | xargs -I % curl -sSLo <project>.tar.xz %
クロスコンパイル関連
autotools系(configure)は、./configure
実行時に以下のパラメータを付加します。--exec-prefix
が必要かどうかはプロジェクトによって異なるようです。./configure --help
で指定できるパラメータのヘルプを見れるプロジェクトが多いです。
--host=x86_64-w64-mingw32
--prefix=/usr/x86_64-w64-mingw32
--exec-prefix=/usr/bin/x86_64-w64-mingw32-
CFLAGS="-I/usr/x86_64-w64-mingw32/include"
CPPFLAGS="-I/usr/x86_64-w64-mingw32/include"
LDFLAGS="-L/usr/x86_64-w64-mingw32/lib"
CMake系(CMakeLists.txt)はcmake
実行時に以下のパラメータを付加します。
-DCMAKE_SYSTEM_NAME=Windows
-DCMAKE_SYSTEM_PROCESSOR=AMD64
-DCMAKE_C_COMPILER=/usr/bin/x86_64-w64-mingw32-gcc
-DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres
-DCMAKE_INCLUDE_PATH=/usr/x86_64-w64-mingw32/include
-DCMAKE_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib
-DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32
ファイルサイズ関連
シンボル情報の容量が大きめです。ビルド時やリンク時に-s
オプションを付けるとシンボル情報を保持しないため、そこそこファイルサイズの削減になります。
CFLAGS=-s
CPPFLAGS=-s
LDFLAGS=-s
シンボル情報はbinutils
のツールを使用することで、後から削除することもできます。
# シンボル情報の確認
nm some.exe
nm-new some.exe
# シンボル情報の削除
strip -s some.exe
strip-new -s some.exe
# Linux上で実行する場合
x86_64-w64-mingw32-strip -s some.exe
その他、ビルド時のファイル容量削減は下の参考サイトに解説があります。オプションは物によってはアプリ自体が動かなくなってしまうことがあるので、ダメそうであれば諦めましょう。
ビルド関連の参考サイト
カテゴリ: Windows