MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Windows10でcコードからdllを作り、Julia1.0から呼び出す方法

目次

はじめに

Juliaでは、ccallという関数を使うと、

簡単にc言語のコードから生成された

共有ライブラリの関数を利用することができますが、

Windows10+Julia1.0で実施しようと思ったところ、

色々ハマったので、やり方をメモとして残しておきます。

基本的なやりかた

基本的に下記の記事の通りに実施できます。

しかし、色々説明されてないところや、

内容が古い部分があるので、注意が必要です。

1. mingwの64bit版とgccの64bit版をインストールする。

普通にmingwをインストールすると、32bit版であることが多いです。

mingwの64bit版はここからダウンロードできます。

次の注意点は、インストーラをデフォルト設定のままインストールすると、

mingwは64bitですが、gccが32bitになってしまうので、

インストーラの設定画面で、

Architectureをi686 -> x86_64に設定してインストールする必要があります。

 

インストール後に、mingwのコンソールから、

$ gcc --version

とし、64bit版が入っているか確認します。

 

インストールしても、gccが認識しない場合は、

mingwのterminalを起動し、gccのパスを確認した後、

そのパスを環境変数のPathに追加します。

 

2. 環境変数の設定

LD_LIBRARY_PATHという環境変数に、

dllにしたいCコードがあるディレクトリを指定します。

export LD_LIBRARY_PATH="to/path/ccode"

3. コードのコンパイル&Juliaから実行する

最後に、下記の記事のコードを使って、

Cコードをコンパイルしてdllを作成し、

Juliaからccallでdllの関数を利用します。

 

しかし、前述のコードはJulia0.6用で、

Julia1.0では、Libdl.dlextが無くなっているので、

下記のコードの部分を

# compile the C code into a shared library
open(`gcc -fPIC -O3 -msse3 -xc -shared -o $(Clib * "." * Libdl.dlext) -`, "w") do f
  print(f, C_code) 
end

下記のように変更します。

# compile the C code into a shared library
open(`gcc -fPIC -O3 -msse3 -xc -shared -o $(Clib * ".dll") -`, "w") do f
  print(f, C_code) 
end

そうすれば、前述の記事のコードのように、

cのコードからdllを生成し、Juliaからccallで利用することができます。

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com