加载dll文件

在release文件夹中,是包含的编译好的文件,然后在matlab中,输入以下命令

  1. loadlibrary('D:\r\LightGBM-master\Release\lib_lightgbm', 'D:\r\LightGBM-master\Release\lib_lightgbm.h');

会出现很多错误

错误使用 loadlibrary 无法对输入文件进行预处理。 预处理器生成的输出为: D:\r\LightGBM-master\Release\lib_lightgbm.h:19:10: fatal error: cstdio: No such file or directory 19 | #include “cstdio” | ^~~~ compilation terminated.

我们需要将lib_lightbgm.h中的# include 后面的部分更换一下,不然的话,是找不到对应的头文件的
image.png
图1. 更换头文件
更换好文件后,再次输入上述命令,依旧会出现如下错误

错误使用 loadlibrary 生成 lib_lightgbm_thunk_pcwin64 失败。编译器输出为: D:\MingWin\bin\gcc -I”D:\Matalb2016b\Install\extern\include” -fexceptions -fno-omit-frame-pointer -I”C:\Windows\system32”

-I”D:\r\LightGBM-master\Release” “lib_lightgbm_thunk_pcwin64.c” -o “lib_lightgbm_thunk_pcwin64.dll” -shared

In file included from lib_lightgbm_thunk_pcwin64.c:27:

D:\r\LightGBM-master\Release/lib_lightgbm.h: In function ‘LastErrorMsg’:

D:\r\LightGBM-master\Release/lib_lightgbm.h:1300:51: error: expected ‘;’ before ‘char’

1300 | static char* LastErrorMsg() { static THREAD_LOCAL char err_msg[512] = “Everything is fine”; return err_msg; }

  1. | ^~~~

D:\r\LightGBM-master\Release/lib_lightgbm.h:1300:100: warning: function returns address of local variable [-Wreturn-local-addr]

1300 | static char* LastErrorMsg() { static THREAD_LOCAL char err_msg[512] = “Everything is fine”; return err_msg; }

  1. | ^~~~~~~

lib_lightgbm_thunk_pcwin64.c: At top level:

D:\r\LightGBM-master\Release/lib_lightgbm.h:1311:12: warning: ‘LastErrorMsg’ is static but used in inline function ‘LGBM_SetLastError’

which is not static

1311 | snprintf(LastErrorMsg(), err_buf_len, “%s”, msg);

  1. | ^~~~~~~~~~~~

D:\r\LightGBM-master\Release/lib_lightgbm.h:1311:3: warning: ‘snprintf’ is static but used in inline function ‘LGBM_SetLastError’ which is

not static

1311 | snprintf(LastErrorMsg(), err_buf_len, “%s”, msg);

  1. | ^~~~~~~~

matlab2016b+visual studio2017

这时,我们需要将MATLAB的C++编译器更换为Visual Studio。需要将下面的文件解压到D:\Matalb2016b\bin\win64\mexopts文件夹中,如图2所示mexopts.zip
image.png
图2. 对应文件
然后输入以下命令,选择Visual Studio2017,如图3所示

  1. mex -setup

image.png
图 3. 选择编译器

查看dll函数

输入以下命令

  1. libfunctions lib_lightgbm -full

可以看到其中的结果

[int32, voidPtr, voidPtr] LGBM_BoosterAddValidData(voidPtr, voidPtr)

[int32, voidPtr, int64Ptr] LGBM_BoosterCalcNumPredict(voidPtr, int32, int32, int32, int32, int64Ptr)

[int32, voidPtr, cstring, voidPtrPtr] LGBM_BoosterCreate(voidPtr, cstring, voidPtrPtr)

[int32, cstring, int32Ptr, voidPtrPtr] LGBM_BoosterCreateFromModelfile(cstring, int32Ptr, voidPtrPtr)

[int32, voidPtr, int64Ptr, cstring] LGBM_BoosterDumpModel(voidPtr, int32, int32, int32, int64, int64Ptr, cstring)

[int32, voidPtr, doublePtr] LGBM_BoosterFeatureImportance(voidPtr, int32, int32, doublePtr)

[int32, voidPtr] LGBM_BoosterFree(voidPtr)

[int32, voidPtr, int32Ptr, voidPtr] LGBM_BoosterFreePredictSparse(voidPtr, int32Ptr, voidPtr, int32, int32)

[int32, voidPtr, int32Ptr] LGBM_BoosterGetCurrentIteration(voidPtr, int32Ptr)

[int32, voidPtr, int32Ptr, doublePtr] LGBM_BoosterGetEval(voidPtr, int32, int32Ptr, doublePtr)

[int32, voidPtr, int32Ptr] LGBM_BoosterGetEvalCounts(voidPtr, int32Ptr)

[int32, voidPtr, int32Ptr, uint64Ptr, stringPtrPtr] LGBM_BoosterGetEvalNames(voidPtr, int32, int32Ptr, uint64, uint64Ptr, stringPtrPtr)

[int32, voidPtr, int32Ptr, uint64Ptr, stringPtrPtr] LGBM_BoosterGetFeatureNames(voidPtr, int32, int32Ptr, uint64, uint64Ptr, stringPtrPtr)

[int32, voidPtr, doublePtr] LGBM_BoosterGetLeafValue(voidPtr, int32, int32, doublePtr)

[int32, voidPtr, doublePtr] LGBM_BoosterGetLowerBoundValue(voidPtr, doublePtr)

[int32, voidPtr, int32Ptr] LGBM_BoosterGetNumClasses(voidPtr, int32Ptr)

[int32, voidPtr, int32Ptr] LGBM_BoosterGetNumFeature(voidPtr, int32Ptr)

[int32, voidPtr, int64Ptr] LGBM_BoosterGetNumPredict(voidPtr, int32, int64Ptr)

[int32, voidPtr, int64Ptr, doublePtr] LGBM_BoosterGetPredict(voidPtr, int32, int64Ptr, doublePtr)

[int32, voidPtr, doublePtr] LGBM_BoosterGetUpperBoundValue(voidPtr, doublePtr)

[int32, cstring, int32Ptr, voidPtrPtr] LGBM_BoosterLoadModelFromString(cstring, int32Ptr, voidPtrPtr)

[int32, voidPtr, voidPtr] LGBM_BoosterMerge(voidPtr, voidPtr)

[int32, voidPtr, int32Ptr] LGBM_BoosterNumModelPerIteration(voidPtr, int32Ptr)

[int32, voidPtr, int32Ptr] LGBM_BoosterNumberOfTotalModel(voidPtr, int32Ptr)

[int32, voidPtr, voidPtr, int32Ptr, voidPtr, cstring, int64Ptr, doublePtr] LGBM_BoosterPredictForCSC(voidPtr, voidPtr, int32, int32Ptr, voidPtr, int32, int64, int64, int64, int32, int32, int32, cstring, int64Ptr, doublePtr)

[int32, voidPtr, voidPtr, int32Ptr, voidPtr, cstring, int64Ptr, doublePtr] LGBM_BoosterPredictForCSR(voidPtr, voidPtr, int32, int32Ptr, voidPtr, int32, int64, int64, int64, int32, int32, int32, cstring, int64Ptr, doublePtr)

[int32, voidPtr, voidPtr, int32Ptr, voidPtr, cstring, int64Ptr, doublePtr] LGBM_BoosterPredictForCSRSingleRow(voidPtr, voidPtr, int32, int32Ptr, voidPtr, int32, int64, int64, int64, int32, int32, int32, cstring, int64Ptr, doublePtr)

[int32, voidPtr, voidPtr, int32Ptr, voidPtr, int64Ptr, doublePtr] LGBM_BoosterPredictForCSRSingleRowFast(voidPtr, voidPtr, int32, int32Ptr, voidPtr, int64, int64, int64Ptr, doublePtr)

[int32, voidPtr, cstring, voidPtrPtr] LGBM_BoosterPredictForCSRSingleRowFastInit(voidPtr, int32, int32, int32, int32, int64, cstring, voidPtrPtr)

[int32, voidPtr, cstring, cstring, cstring] LGBM_BoosterPredictForFile(voidPtr, cstring, int32, int32, int32, int32, cstring, cstring)

[int32, voidPtr, voidPtr, cstring, int64Ptr, doublePtr] LGBM_BoosterPredictForMat(voidPtr, voidPtr, int32, int32, int32, int32, int32, int32, int32, cstring, int64Ptr, doublePtr)

[int32, voidPtr, voidPtr, cstring, int64Ptr, doublePtr] LGBM_BoosterPredictForMatSingleRow(voidPtr, voidPtr, int32, int32, int32, int32, int32, int32, cstring, int64Ptr, doublePtr)

[int32, voidPtr, voidPtr, int64Ptr, doublePtr] LGBM_BoosterPredictForMatSingleRowFast(voidPtr, voidPtr, int64Ptr, doublePtr)

[int32, voidPtr, cstring, voidPtrPtr] LGBM_BoosterPredictForMatSingleRowFastInit(voidPtr, int32, int32, int32, int32, int32, cstring, voidPtrPtr)

[int32, voidPtr, voidPtrPtr, cstring, int64Ptr, doublePtr] LGBM_BoosterPredictForMats(voidPtr, voidPtrPtr, int32, int32, int32, int32, int32, int32, cstring, int64Ptr, doublePtr)

[int32, voidPtr, voidPtr, int32Ptr, voidPtr, cstring, int64Ptr, voidPtrPtr, int32PtrPtr, voidPtrPtr] LGBM_BoosterPredictSparseOutput(voidPtr, voidPtr, int32, int32Ptr, voidPtr, int32, int64, int64, int64, int32, int32, int32, cstring, int32, int64Ptr, voidPtrPtr, int32PtrPtr, voidPtrPtr)

[int32, voidPtr, int32Ptr] LGBM_BoosterRefit(voidPtr, int32Ptr, int32, int32)

[int32, voidPtr, cstring] LGBM_BoosterResetParameter(voidPtr, cstring)

[int32, voidPtr, voidPtr] LGBM_BoosterResetTrainingData(voidPtr, voidPtr)

[int32, voidPtr] LGBM_BoosterRollbackOneIter(voidPtr)

[int32, voidPtr, cstring] LGBM_BoosterSaveModel(voidPtr, int32, int32, int32, cstring)

[int32, voidPtr, int64Ptr, cstring] LGBM_BoosterSaveModelToString(voidPtr, int32, int32, int32, int64, int64Ptr, cstring)

[int32, voidPtr] LGBM_BoosterSetLeafValue(voidPtr, int32, int32, double)

[int32, voidPtr] LGBM_BoosterShuffleModels(voidPtr, int32, int32)

[int32, voidPtr, int32Ptr] LGBM_BoosterUpdateOneIter(voidPtr, int32Ptr)

[int32, voidPtr, singlePtr, singlePtr, int32Ptr] LGBM_BoosterUpdateOneIterCustom(voidPtr, singlePtr, singlePtr, int32Ptr)

[int32, voidPtr, voidPtr] LGBM_DatasetAddFeaturesFrom(voidPtr, voidPtr)

[int32, voidPtr, voidPtrPtr] LGBM_DatasetCreateByReference(voidPtr, int64, voidPtrPtr)

[int32, voidPtr, int32Ptr, voidPtr, cstring, voidPtr, voidPtrPtr] LGBM_DatasetCreateFromCSC(voidPtr, int32, int32Ptr, voidPtr, int32, int64, int64, int64, cstring, voidPtr, voidPtrPtr)

[int32, voidPtr, int32Ptr, voidPtr, cstring, voidPtr, voidPtrPtr] LGBM_DatasetCreateFromCSR(voidPtr, int32, int32Ptr, voidPtr, int32, int64, int64, int64, cstring, voidPtr, voidPtrPtr)

[int32, voidPtr, cstring, voidPtr, voidPtrPtr] LGBM_DatasetCreateFromCSRFunc(voidPtr, int32, int64, cstring, voidPtr, voidPtrPtr)

[int32, cstring, cstring, voidPtr, voidPtrPtr] LGBM_DatasetCreateFromFile(cstring, cstring, voidPtr, voidPtrPtr)

[int32, voidPtr, cstring, voidPtr, voidPtrPtr] LGBM_DatasetCreateFromMat(voidPtr, int32, int32, int32, int32, cstring, voidPtr, voidPtrPtr)

[int32, voidPtrPtr, int32Ptr, cstring, voidPtr, voidPtrPtr] LGBM_DatasetCreateFromMats(int32, voidPtrPtr, int32, int32Ptr, int32, int32, cstring, voidPtr, voidPtrPtr)

[int32, doublePtrPtr, int32PtrPtr, int32Ptr, cstring, voidPtrPtr] LGBM_DatasetCreateFromSampledColumn(doublePtrPtr, int32PtrPtr, int32, int32Ptr, int32, int32, cstring, voidPtrPtr)

[int32, voidPtr, cstring] LGBM_DatasetDumpText(voidPtr, cstring)

[int32, voidPtr] LGBM_DatasetFree(voidPtr)

[int32, voidPtr, int32Ptr, uint64Ptr, stringPtrPtr] LGBM_DatasetGetFeatureNames(voidPtr, int32, int32Ptr, uint64, uint64Ptr, stringPtrPtr)

[int32, voidPtr, cstring, int32Ptr, voidPtrPtr, int32Ptr] LGBM_DatasetGetField(voidPtr, cstring, int32Ptr, voidPtrPtr, int32Ptr)

[int32, voidPtr, int32Ptr] LGBM_DatasetGetNumData(voidPtr, int32Ptr)

[int32, voidPtr, int32Ptr] LGBM_DatasetGetNumFeature(voidPtr, int32Ptr)

[int32, voidPtr, int32Ptr, cstring, voidPtrPtr] LGBM_DatasetGetSubset(voidPtr, int32Ptr, int32, cstring, voidPtrPtr)

[int32, voidPtr, voidPtr] LGBM_DatasetPushRows(voidPtr, voidPtr, int32, int32, int32, int32)

[int32, voidPtr, voidPtr, int32Ptr, voidPtr] LGBM_DatasetPushRowsByCSR(voidPtr, voidPtr, int32, int32Ptr, voidPtr, int32, int64, int64, int64, int64)

[int32, voidPtr, cstring] LGBM_DatasetSaveBinary(voidPtr, cstring)

[int32, voidPtr, stringPtrPtr] LGBM_DatasetSetFeatureNames(voidPtr, stringPtrPtr, int32)

[int32, voidPtr, cstring, voidPtr] LGBM_DatasetSetField(voidPtr, cstring, voidPtr, int32, int32)

[int32, cstring, cstring] LGBM_DatasetUpdateParamChecking(cstring, cstring)

[int32, voidPtr] LGBM_FastConfigFree(voidPtr)

cstring LGBM_GetLastError

int32 LGBM_NetworkFree

[int32, cstring] LGBM_NetworkInit(cstring, int32, int32, int32)

[int32, voidPtr, voidPtr] LGBM_NetworkInitWithFunctions(int32, int32, voidPtr, voidPtr)

[int32, voidPtr] LGBM_RegisterLogCallback(voidPtr)

调用函数

加入我们上面有函数 add,使用calllib函数来调用

  1. calllib(‘dll’, add’, 1.2, 8.8);

结果如下图4所示:
image.png
图4. 调用结果

参考链接

参考链接1:Matlab中调用C++dll