やりたいこと
- Windows版Juliaから問題なく呼べるような、Cライブラリの共有ライブラリ(DLL)をコンパイルする
前提
- Windows版Juliaは、32bit版と64bit版のニ種類がある
- それぞれ、mingw 32/64 bit (thread
win32
) を使ってビルドされている
まとめ
- DLLをビルドする環境は、WindowsでのJuliaコンパイル環境と揃える必要が(当然)あるので、注意が必要
- visual studio はだめです
- mingw 32/64bit, thread win32 (NOT posix) のgcc/g++でOK
- 基本的には、README.windows.md | JuliaLang/Juliaを参考にすればOK
コンパイラはどこで手にいればいいのか
現状のJuliaで使われているコンパイラと同じものは、
64bit
curl -Ls -O https://sourceforge.net/projects/mingw-w64-dgn/files/mingw-w64/mingw-w64-bin-x86_64-20140102.7z
32bit
curl -Ls -O https://sourceforge.net/projects/mingw-w64-dgn/files/mingw-w64/mingw-w32-bin-i686-20140102.7z
で手に入ります。参考: msys_build.sh | JuliaLang/julia
ハマりどころ
- threadがposixのmingwや、msvcでビルドしたDLLをJuliaから使おうとすると(正確には
dlopen
を呼ぶと)、%1 is not a valid win32 application
というあまりinformativeでないメッセージに悩まされることになります… -
README.windows.mdの通りにやると、
mingw-builds
のインストールでコケる場合があるっぽい。少なくとも僕はインストールできませんでした… 参考。まとめに書いたコマンドからダウンロードして、7zを解凍するだけでOKです。また、ここのリンク からmingwをインストールして試してみましたが、問題なさそうでした。 - AppVeyorにデフォルトでインストールされているmingwは、windows版Juliaのコンパイルに使われているものとは互換性がないので注意。参考: appveyor.yml | JuliaLang/julia
例. AppVeyorでDLLをビルドするよう用のシェル
msys_build.sh
#!/bin/sh
set -e
if [ "$ARCH" = x86_64 ]; then
bits=64
else
bits=32
fi
f=mingw-w$bits-bin-$ARCH-20140102.7z
if ! [ -e $f ]; then
echo "Downloading $f"
curl -LsSO https://sourceforge.net/projects/mingw-w64-dgn/files/mingw-w64/$f
fi
7z x $f > /dev/null
export PATH=$PWD/mingw$bits/bin:$PATH
# 適当なビルドコマンド
# make or
# waf configure && waf build 等
julia互換のmingwをダウンロードして、パスを通す、ってことをやっています。僕が書いた例の詳細は、以下のリンクを参考にどうぞ
おわり