C言語でのDLLの作成

むかしむかし、「MT4 〜 C言語で作成したDLLをMQL4で使用する」でDLLを作成した。
当時はwindowsで作成していた。

このたびubuntu14で、同じことをするべく前回と同様のコードを記述してコンパイルした。

#include<stdio.h>
#include<stdlib.h>

int main(){
   return 0;
}

extern "C"
__declspec(dllexport) double __stdcall movingAverages(double a, double b, double c, double d) {
   return((a+b+c+d)/4);
}

これを「MT4 〜 C言語で作成したDLLをMQL4で使用する」で実施したのと同様にコンパイルする。これでDLLが作成されるだろうと思っていたが・・・。

$ g++ -shared -o libtest.dll test.c -Wl,-k,--output-def,Dlltest.def,--out-implib,libtest.a
test.c:10:11: error: expected constructor, destructor, or type conversion before ‘(’ token
 __declspec(dllexport) double __stdcall movingAverages(double a, double b, double c, double d) {

なぜかコンパイルに失敗した。

そこで前回との違いを考えてみた。違いは次の2つ。

・OSがwindowsLinuxかの違い。
コンパイラの違い。

今回の現象に影響がありそうなのは、後者。
そこで思い出してみたが、前回使用していたコンパイラmingwだったではないか。
今回はLinuxで開発しているが、結局動作させるのはwindows上なので、mingwを使うべきなのではないか。
以下、ここから引用。

MinGWについて理解しておく必要がある。
MinGWとは、Minimalist GNU for Windowsの略で、様々な読み方があるが、ミン・ジー・ダブリューと読むのが正しいようだ。
もともとはGNUのCコンパイラGCCWindowsプログラムの開発に使えるようWindows環境に移植し、Windows APIのためのヘッダファイルを追加したものだ。更にこれをLinux上でWindowsプログラムがクロス開発できるよう、Windows APIのヘッダファイル等も含めてLinux向けに移植したものが今回使うUbuntu上のMinGWである。
つまり、Linux上のMinGWとは、GCCを用いたクロス開発環境である。

そういうわけで、mingwUbuntuにインストール。
まずはapt-get installする名前が分からないので調べる。

$ sudo apt-cache search mingw
g++-mingw-w64 - GNU C++ compiler for MinGW-w64
g++-mingw-w64-i686 - GNU C++ compiler for MinGW-w64 targeting Win32
g++-mingw-w64-x86-64 - GNU C++ compiler for MinGW-w64 targeting Win64
gcc-mingw-w64 - GNU C compiler for MinGW-w64
gcc-mingw-w64-base - GNU Compiler Collection for MinGW-w64 (base package)
gcc-mingw-w64-i686 - GNU C compiler for MinGW-w64 targeting Win32
gcc-mingw-w64-x86-64 - GNU C compiler for MinGW-w64 targeting Win64
gdb-mingw-w64 - Cross-debugger for Win32 and Win64 using MinGW-w64

たくさんでてくるが、このへんが関係しそう。
インストールする。

$ sudo apt-get install g++-mingw-w64-x86-64

MinGWを使用してコンパイルする。

$ x86_64-w64-mingw32-g++ -shared -o libtest.dll test.c -Wl,-k,--output-def,Dlltest.def,--out-implib,libtest.a

成功した。