やりたいこと
- 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をダウンロードして、パスを通す、ってことをやっています。僕が書いた例の詳細は、以下のリンクを参考にどうぞ
おわり