LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-14

やりたいこと

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

おわり

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3