Skip to main content

compile - Using Boost with CreateLibrary


I was looking at the answer of Leonid of Faster alternatives for DayOfWeek and wanted to see how hard it would be to do something similar in C++ using an external library like Boost. I tried to include a Boost header in the example of the CreateLibrary help located here



http://reference.wolfram.com/mathematica/CCompilerDriver/ref/CreateLibrary.html


specifying also the path for the Boost files to include and Boost compiled libraries, like I would do in VisualStudio that I use, but the example didn't compile.


So before trying harder, has anyone already succesfully used Boost with the CreateLibrary function ? (new in Mathematica 8).


Thanks



Answer



I managed to get something going:


Needs["CCompilerDriver`"]

src = "
#include \"WolframLibrary.h\"

#include

EXTERN_C DLLEXPORT int dow(WolframLibraryData libData,
mint Argc, MArgument *Args, MArgument Res) {
mint year = MArgument_getInteger(Args[0]);
mint month = MArgument_getInteger(Args[1]);
mint day = MArgument_getInteger(Args[2]);
boost::gregorian::date date(year, month, day);
MArgument_setInteger(Res, date.day_of_week().as_number());
return LIBRARY_NO_ERROR;

}
";

dowlib = CreateLibrary[src, "dow",
"Language" -> "C++",
"IncludeDirectories" -> {Environment["BOOSTDIR"]},
"LibraryDirectories" -> {Environment["BOOSTLIBDIR"]},
"CompileOptions" -> {"/EHsc"}]

A few notes:




  • EXTERN_C is required to stop C++ mangling the name

  • The compile option /EHsc is required to enable C++ exceptions.

  • Your environment variables / boost directories will vary.


Load it up:


dow = LibraryFunctionLoad[dowlib, "dow", {Integer, Integer, Integer}, Integer]

Test it out:


dow[2012, 6, 22]



5



RandomDateList[] := {RandomInteger[{1800, 2100}], RandomInteger[{1, 12}],
RandomInteger[{1, 28}], RandomInteger[{0, 23}], RandomInteger[{0, 59}],
RandomInteger[{0, 59}]};
RandomDates[n_] := Table[RandomDateList[], {n}]

d = RandomDates[100000];


dow[Sequence @@ #[[;; 3]]] & /@ d // AbsoluteTiming // Short


{0.6562500,{6,6,1,2,5,3,4,0,0,3,0,<<99978>>,6,6,3,1,4,5,6,5,4,4,4}}



Huzzah!


Don't forget to unload it if you want to recompile:


LibraryFunctionUnload[dow]


FYI:


CCompilers[]
(* -> {{Name->Visual Studio,
Compiler->CCompilerDriver`VisualStudioCompiler`VisualStudioCompiler,
CompilerInstallation->c:\Program Files\Microsoft Visual Studio 9.0,
CompilerName->Automatic}} *)

Comments