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つ。
今回の現象に影響がありそうなのは、後者。
そこで思い出してみたが、前回使用していたコンパイラはmingwだったではないか。
今回はLinuxで開発しているが、結局動作させるのはwindows上なので、mingwを使うべきなのではないか。
以下、ここから引用。
MinGWについて理解しておく必要がある。
MinGWとは、Minimalist GNU for Windowsの略で、様々な読み方があるが、ミン・ジー・ダブリューと読むのが正しいようだ。
もともとはGNUのCコンパイラGCCをWindowsプログラムの開発に使えるようWindows環境に移植し、Windows APIのためのヘッダファイルを追加したものだ。更にこれをLinux上でWindowsプログラムがクロス開発できるよう、Windows APIのヘッダファイル等も含めてLinux向けに移植したものが今回使うUbuntu上のMinGWである。
つまり、Linux上のMinGWとは、GCCを用いたクロス開発環境である。
そういうわけで、mingwをUbuntuにインストール。
まずは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
$ x86_64-w64-mingw32-g++ -shared -o libtest.dll test.c -Wl,-k,--output-def,Dlltest.def,--out-implib,libtest.a
成功した。