· 

WSL+mingwでWindowsDLLをクロスコンパイル

なんで?って感じ。やっぱりWSLだと汚れたときにきれいにできるから、、、

で、「WSLでGNU Octave」の回をなぞって、synapticを起動するところまでやります。

 synapticでmingwを検索。

こうなる。

で、まぁまぁかたっぱしからやる。(正直何が正しいのかわからない)

ついでに、

build-essential

unzip

cmake

libtool-bin

もインストールしておく(マジで正直要るのかどうかさっぱりわからん)。

で、とりあえず、なんかやってみる。

matioというMATLABのMATファイルを読み書きするライブラリを作ってみる。ここからmatio-1.5.21.tar.gzをとってきて、~/workふぉるだに入れる(workフォルダは事前に作っておく)。で、

tar zxfv matio-1.5.21.tar.gz

cd matio-1.5.21

./configure  CC=i686-w64-mingw32-gcc --host=i686-w64-mingw32

make

で、

こういうの出ますが

libtool: link: i686-w64-mingw32-gcc -I../src -I../getopt -g -O2 -o .libs/test_mat.exe test_mat.o  -L../src ../src/.libs/libmatio.dll.a ../getopt/.libs/libgetopt.a -lz -L/usr/local/lib

libtool:   error: Could not determine the host path corresponding to

libtool:   error:   '/home/hoge/work/matio-1.5.21/src/.libs'

libtool:   error: Continuing, but uninstalled executables may not work.

libtool:   error: Could not determine the host path corresponding to

libtool:   error:   '/home/hoge/work/matio-1.5.21/src:/home/hoge/work/matio-1.5.21/src/.libs:/usr/local/lib:/usr/local/bin'

libtool:   error: Continuing, but uninstalled executables may not work.

 

~/work/matio-1.5.21/src/.libsにlibmatio-11.dllができている。とりあえず、Dependencies(DependencyWalkerの新しいやつっぽい)で見てみる。解凍して、DependenciesGui.exeを実行。

File->Openでファイル名に「\\wsl$」って入れて掘っていき、libmatio-11.dllを開く。 左のツリーで、一番上のそれらしいやつをつつくと、

ってなるので、いちおうできているっぽい。ちゃんと動くかどうか確認したいけど、make checkは動かない(無理やり動かすこともできるけどエラーばっかりになる)。

 

で、もう一つやってみる(これも動作確認までしてない(#-∀-))。

 

ここからlapack-3.10.0.tar.gzをとってくる。~/workにコピーして、

cd ~/work

tar zxfv lapack-3.10.0.tar.gz

cd lapack-3.10.0

cp make.inc.example make.inc

で、ここでWindowsに侵されている初老のおじさんはエクスプローラで\\wsl$から掘っていく。でmake.incを編集。

CC = i686-w64-mingw32-gcc

FC = i686-w64-mingw32-gfortran

AR = i686-w64-mingw32-ar

RANLIB = i686-w64-mingw32-ranlib

と4箇所変更して保存。

で、

make blaslib

ってすると、

librefblas.a

ができる。

i686-w64-mingw32-dllwrap --export-all-symbols librefblas.a -lgfortran -o librefblas.dll

とすると

librefblas.dll

ができる。

Dependenciesで確認すると、

libgfortran-5.dllに依存していることがわかる、、、だめじゃん。

 

i686-w64-mingw32-dllwrap --export-all-symbols librefblas.a -static -lgfortran -lquadmath -o librefblas.dll

やら

i686-w64-mingw32-dllwrap --export-all-symbols librefblas.a -Wl,-Bstatic,-lgfortran,-lquadmath -o librefblas.dll

やら

試したけどやっぱりlibgfortran-5から逃れられない、、、

と思いきや、どうやらDependenciesで確認するときにはWSLから取り出したほうがいいみたい

で、

i686-w64-mingw32-dllwrap --export-all-symbols librefblas.a -static -lgfortran -lquadmath -o librefblas.dll

で、

librefblas.dllをE:\wsl(紛らわしいけどWSLの外です)にコピーして

 

いいぞ、、、って当初何しようとしていたんだったっけ?