加载dll文件
在release文件夹中,是包含的编译好的文件,然后在matlab中,输入以下命令
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 后面的部分更换一下,不然的话,是找不到对应的头文件的
图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; }
| ^~~~
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; }
| ^~~~~~~
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);
| ^~~~~~~~~~~~
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);
| ^~~~~~~~
matlab2016b+visual studio2017
这时,我们需要将MATLAB的C++编译器更换为Visual Studio。需要将下面的文件解压到D:\Matalb2016b\bin\win64\mexopts文件夹中,如图2所示mexopts.zip
图2. 对应文件
然后输入以下命令,选择Visual Studio2017,如图3所示
mex -setup
查看dll函数
输入以下命令
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
函数来调用
calllib(‘dll’, ‘add’, 1.2, 8.8);