How to create dll using gcc compiler/Mingw for visual basic?

dll, gcc, mingw

Solution

The following is how I was able to get MinGW to build a DLL to be used in Excel 2003 VBA.

fooBar.cpp

int __stdcall Foo(int x)   
{   
    return x * x;   
}

double __stdcall Bar(double x)   
{   
    return x * x;   
}

1) Start MinGW shell and create a directory called `fooBar` . Close the Excel Workbook (if open).

mkdir -p fooBar
cd fooBar
rm *.a *.dll *.def 

2) Compile and generate a .def file - Note: this dll will not work because it has mangled symbols.

gcc -shared -o fooBar.dll fooBar.cpp -Wl,--output-def,fooBar.def,--out-implib,libfooBardll.a

The generated fooBar.def will look something like:

EXPORTS
    _Z3Bard@8 @1
    _Z3Fooi@4 @2

3) Modify the generated fooBar.def file by adding clean symbol aliases for the generated symbols. fooBar.def should now look something like:

EXPORTS
    _Z3Bard@8 @1
    _Z3Fooi@4 @2
    Bar = _Z3Bard@8
    Foo = _Z3Fooi@4

4) Cleaup again (except for the modified fooBar.def)

rm *.a *.dll 

5) Compile with .def file with clean symbol aliases for the generated symbols.

gcc -shared -o fooBar.dll fooBar.cpp fooBar.def -Wl,--out-implib,libfooBar_dll.a

6) Open Excel and add the following VBA code (make sure to use the proper path, doubt it will have mmorris in it):

Private Declare Function Foo Lib _
    "C:\MinGW\msys\1.0\home\mmorris\fooBar\fooBar.dll" _
    (ByVal x As Long) As Long

Private Declare Function Bar Lib _
    "C:\MinGW\msys\1.0\home\mmorris\fooBar\fooBar.dll" _
    (ByVal x As Double) As Double

7) If you want to call the functions from an Excel Workbook, in a cell type `=Foo(5)` or `=Bar(5)`

Problem

How to create dll using gcc compiler/Mingw for visual basic?

Original source