WindowsのJuliaから呼べるようなCライブラリの共有ライブラリ(DLL)を作る

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

やりたいこと

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

おわり

参考