Example Code

Walkthrough for Creating a MATLAB DLL That Can Be Called in LabVIEW

Code and Documents

Attachment

Overview

 

This example provides the complete instructions and solution for creating a MATLAB function, building it into a DLL, and wrapping that DLL to expose parameters that are easy to interface with directly in LabVIEW.

 

Description

 

When interfacing with MATLAB from LabVIEW, you have many choices.  The MathScript node will actually compile your M code directly in LabVIEW and does not require MATLAB at all, but it has limited function support.  The MATLAB Script Node allows you to call into MATLAB through an ActiveX/COM interface, but your code has to sit on the LabVIEW block diagram, meaning that you now are maintaining your code in two places, the M script and the LabVIEW block diagram.  A DLL allows for protecting your code and packaging it in a compiled binary that is less cumbersome to interface with and more performant than an EXE.

 

The attached walkthrough has you create a simple MATLAB function that takes in an array and increments all elements in it by 1. 

 

MATLAB Code.pngMATLAB Output.png

 

It then covers how to build this function into a DLL you can then call in LabVIEW.

 

Front Panel.png

Block Diagram.png

 

Hardware and Software Requirements

 

LabVIEW 2014 or later

MATLAB (I used R2016b, but earlier versions should work.  Your version of MATLAB MUST be the same bitness as the bitness of LabVIEW in which you want to call your DLL.)

MATLAB Compiler SDK for the same version as MATLAB as above

Windows SDK 7.1 or similar MATLAB-supported C compiler

 

Steps to Implement or Execute Code

 

Running the LabVIEW code itself is trivial.  Just open the library and run any of the functions.  The value of this example is the complete walkthrough (provided both as a Word doc and a PDF) and the full solution, including all M and C files, required to build the DLL.

 

 

Example code from the Example Code Exchange in the NI Community is licensed with the MIT license.

Comments
vcuphysics
Member
Member
on

I am using matlab 2017b.

The first dll compiles fine.

When trying to compile the wrapper dll, I get the error:

 

Error using mbuild (line 164)
Unable to complete successfully.
C:/ProgramData/MATLAB/SupportPackages/R2017b/3P.instrset/mingw_w64.instrset/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x2e):
undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status

 

Any thoughts on why this does not compile?  Thanks!

 

 

croohcifer
Member
Member
on
YSJIN
Member
Member
on

Hello,

When there are two m files, 'exam.m' and 'examfunc.m' as shown below, how should I make wrapper dll if I want to use 'examfunc.m' in LabVIEW?
 

function y = exam(x)

y=x+1;

 

function y = examfunc(x)

y=exam(x);

 

Thanks!

gptshubham595
Member
Member
on

 

Getting this error how to solve this?

 

Error using mbuild (line 166)
Unable to complete successfully.
The command 'link' exited with a return value '1'

 

FULL CONSOLE OUTPUT

 

mbuild -v exampleWrapper.c exampleScript.lib LINKFLAGS="$LINKFLAGS /DLL
/DEF:exampleWrapper.def" LDEXT=".dll"" CMDLINE250="mt -outputresource:$EXE';'2 -
manifest $MANIFEST"
Verbose mode is on.
... Looking for compiler 'Microsoft Visual C++ 2017 (C)' ...
... Looking for registry setting 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 15.0 ...Yes ('D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\').
... Executing command 'set "vcroot=D:\Program Files (x86)\Microsoft Visual Studio\2017\Community"&for /f "delims= " %a in ('type "D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"') do @if exist "D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe" call echo %vcroot%' ...Yes ('D:\Program Files (x86)\Microsoft Visual Studio\2017\Community').
... Looking for registry setting 'HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0' InstallationFolder ...Yes ('C:\Program Files (x86)\Windows Kits\10\').
... Looking for registry setting 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 15.0 ...Yes ('D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\').
... Looking for registry setting 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 15.0 ...Yes ('D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\').
... Executing command 'set "vcroot=D:\Program Files (x86)\Microsoft Visual Studio\2017\Community"&for /f "delims= " %a in ('type "D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"') do @if exist "D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe" call echo %vcroot%\VC\Tools\MSVC\%a' ...Yes ('D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023').
... Looking for registry setting 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 15.0 ...Yes ('D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\').
... Looking for file 'D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat' ...Yes.
... Looking for folder 'D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build' ...Yes.
... Looking for registry setting 'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots' KitsRoot10 ...Yes ('C:\Program Files (x86)\Windows Kits\10\').
... Looking for registry setting 'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots' KitsRoot10 ...Yes ('C:\Program Files (x86)\Windows Kits\10\').
... Executing command 'echo off&set "sdkversion="&(for /f %a IN ('dir "C:\Program Files (x86)\Windows Kits\10\include\" /b /ad-h /on') do ( @if exist "C:\Program Files (x86)\Windows Kits\10\include\%a\ucrt\" set "sdkversion=%a" ))&call echo %sdkversion%' ...Yes ('10.0.17763.0').
Found installed compiler 'Microsoft Visual C++ 2017 (C)'.
Set PATH = D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\vcpackages;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools;C:\Program Files (x86)\Windows Kits\10\\Bin\10.0.17763.0\x64;C:\Program Files (x86)\Windows Kits\10\\Bin\10.0.17763.0\x86;C:\Program Files (x86)\Windows Kits\10\\Bin\x64;C:\Program Files (x86)\Windows Kits\10\\Bin\x86;;D:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin;D:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\libnvvp;C:\Program Files\National Instruments\Shared\OpenVINO\;D:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin;D:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\libnvvp;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\Program Files\PuTTY\;D:\Program Files\nodejs\;C:\ProgramData\chocolatey\bin;D:\Program Files\Git\cmd;D:\Program Files\Git\mingw64\bin;D:\Program Files\Git\usr\bin;C:\ProgramData\chocolatey\lib\gsudo\bin\;C:\ProgramData\nvm;C:\Program Files\nodejs;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\DockerDesktop\version-bin;C:\Program Files\TortoiseSVN\bin;d:\Users\SHUBHAM\anaconda3\Scripts;d:\Users\SHUBHAM\anaconda3\Lib;d:\Users\SHUBHAM\anaconda3\Library;d:\Users\SHUBHAM\anaconda3\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Windows\PolicyDefinitions\;C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Bin\;C:\Program Files\IVI Foundation\VISA\Win64\Bin\;C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Bin;C:\Program Files (x86)\National Instruments\Shared\LabVIEW CLI;C:\Program Files (x86)\Yarn\bin\;C:\Program Files\NVIDIA Corporation\Nsight Compute 2020.3.0\;D:\Go\bin;D:\Program Files\MATLAB\R2020a\runtime\win64;D:\Program Files\MATLAB\R2020a\bin;C:\Users\SHUBHAM\scoop\apps\yarn\current\global\node_modules\.bin;C:\Users\SHUBHAM\scoop\apps\yarn\current\Yarn\bin;C:\Users\SHUBHAM\scoop\shims;D:\Ruby26\bin;D:\Program Files (x86)\Nmap;C:\Users\SHUBHAM\AppData\Roaming\npm;C:\Users\SHUBHAM\go\bin;d:\Users\SHUBHAM\anaconda3;d:\Users\SHUBHAM\anaconda3\Scripts;d:\Users\SHUBHAM\anaconda3\Lib;d:\Users\SHUBHAM\anaconda3\Library\bin;d:\Program Files\Java\jdk-14\bin;C:\Program Files\Java\jre1.8.0_251\bin;D:\Program Files\heroku\bin;C:\Python27\Scripts;C:\Python27\Lib;d:\Program Files\Git\bin;C:\Users\SHUBHAM\scoop\apps\gsudo\current;d:\xampp\php\;d:\xampp\perl\bin;D:\xampp\mysql\bin;D:\Program Files\Java\jdk-11\bin;D:\flutter\bin;D:\ta-lib\c\lib;D:\ta-lib\c\include;D:\ta-lib\c\bin;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\VC\Tools\MSVC\14.16.27023\bin;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\VC\Tools\MSVC\14.16.27023\include;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\Common7\IDE;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\Common7\Tools;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\VC\Auxiliary\Build;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64;d:\Program Files (x86)\Microsoft Visual Studio\2017\\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86;C:\Users\SHUBHAM\AppData\Local\Programs\Microsoft VS Code\bin;C:\Program Files\Android\Android Studio\bin;C:\Program Files\Android\Android Studio\lib;C:\Program Files\Android\Android Studio\jre;D:\hydra\;D:\Program Files\Git\mingw64\bin;C:\Users\SHUBHAM\AppData\Local\Yarn\bin;d:\Program Files\CodeBlocks\MinGW\bin\;C:\Users\SHUBHAM\go\bin;D:\Program Files\MATLAB\R2020a\bin\;D:\Program Files\MATLAB\R2020a\bin\win32;
Set INCLUDE = D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\ucrt;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\shared;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\um;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\winrt;D:\Program Files\MATLAB\R2020a\extern\include;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\ucrt;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\shared;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\um;C:\Program Files (x86)\Windows Kits\10\\include\10.0.17763.0\winrt;D:\Program Files\MATLAB\R2020a\extern\include;
Set LIB = D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x64;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64;C:\Program Files (x86)\Windows Kits\10\\Lib\10.0.17763.0\ucrt\x64;C:\Program Files (x86)\Windows Kits\10\\lib\10.0.17763.0\um\x64;D:\Program Files\MATLAB\R2020a\lib\win64;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x64;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64;C:\Program Files (x86)\Windows Kits\10\\Lib\10.0.17763.0\ucrt\x64;C:\Program Files (x86)\Windows Kits\10\\lib\10.0.17763.0\um\x64;D:\Program Files\MATLAB\R2020a\lib\win64;
Set LIBPATH = D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x64;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x64;D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64;
Options file details
-------------------------------------------------------------------
Compiler location: D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\
Options file: D:\Program Files\MATLAB\R2020a\bin\win64\mexopts\msvc2017.xml
CMDLINE100 : cl /c -MD -Zp8 -GR -W3 -EHsc- -Zc:wchar_t- -nologo -O2 -DNDEBUG /DMATLAB_DEFAULT_RELEASE=R2017b /DUSE_MEX_CMD /DMSVC /DIBMPC /D_CRT_SECURE_NO_DEPRECATE -I"D:\Program Files\MATLAB\R2020a\extern\include" -I"D:\Program Files\MATLAB\R2020a\extern\include\win64" "D:\course\Calling a MATLAB DLL in LabVIEW LV2014\exampleWrapper.c" /FoC:\Users\SHUBHAM\AppData\Local\Temp\mex_36520060630497_19860\exampleWrapper.obj
CMDLINE200 : link "/nologo /manifest /DLL -called_from_matlab C:\Users\SHUBHAM\AppData\Local\Temp\mex_36520060630497_19860\exampleWrapper.obj exampleScript.lib /MACHINE:AMD64 /LIBPATH:"D:\Program Files\MATLAB\R2020a\extern\lib\win64\microsoft" mclmcrrt.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /out:exampleWrapper.exe
CMDLINE250 : mt -outputresource:exampleWrapper.exe;1 -manifest "exampleWrapper.exe.manifest"
CMDLINE300 : del "exampleWrapper.exe.manifest" "exampleWrapper.map"
COMPILER : cl
COMPFLAGS : -MD -Zp8 -GR -W3 -EHsc- -Zc:wchar_t- -nologo
COMPDEFINES : /DMATLAB_DEFAULT_RELEASE=R2017b /DUSE_MEX_CMD /DMSVC /DIBMPC /D_CRT_SECURE_NO_DEPRECATE
MATLABMEX :
OPTIMFLAGS : -O2 -DNDEBUG
INCLUDE : -I"D:\Program Files\MATLAB\R2020a\extern\include" -I"D:\Program Files\MATLAB\R2020a\extern\include\win64"
DEBUGFLAGS : /Z7
LINKER : link
LINKFLAGS : "/nologo /manifest /DLL -called_from_matlab
LINKTYPE :
LINKEXPORT :
LINKEXPORTVER :
LINKLIBS : exampleScript.lib /MACHINE:AMD64 /LIBPATH:"D:\Program Files\MATLAB\R2020a\extern\lib\win64\microsoft" mclmcrrt.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
LINKDEBUGFLAGS : /debug /PDB:"exampleWrapper.pdb"
LINKOPTIMFLAGS :
OBJEXT : .obj
LDEXT : .exe
SETENV : set COMPILER=cl
set COMPFLAGS=/c -MD -Zp8 -GR -W3 -EHsc- -Zc:wchar_t- -nologo /DMATLAB_DEFAULT_RELEASE=R2017b /DUSE_MEX_CMD /DMSVC /DIBMPC /D_CRT_SECURE_NO_DEPRECATE
set OPTIMFLAGS=-O2 -DNDEBUG
set DEBUGFLAGS=/Z7
set LINKER=link
set LINKFLAGS="/nologo /manifest /DLL -called_from_matlab /export:%ENTRYPOINT% exampleScript.lib /MACHINE:AMD64 /LIBPATH:"D:\Program Files\MATLAB\R2020a\extern\lib\win64\microsoft" mclmcrrt.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
set LINKDEBUGFLAGS=/debug /PDB:"%OUTDIR%%MEX_NAME%.exe.pdb"
set NAME_OUTPUT=/out:"%OUTDIR%%MEX_NAME%%MEX_EXT%"
VCROOT : D:\Program Files (x86)\Microsoft Visual Studio\2017\Community
SDKROOT : C:\Program Files (x86)\Windows Kits\10\
VSINSTALLDIR : D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\
VCINSTALLDIR : D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023
VCVARSALLDIR : D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
KITSROOT : C:\Program Files (x86)\Windows Kits\10\
SDKVERSION : 10.0.17763.0
MATLABROOT : D:\Program Files\MATLAB\R2020a
ARCH : win64
MTCMDLINE : mt -outputresource:exampleWrapper.exe;1 -manifest "exampleWrapper.exe.manifest"
SRC : "D:\course\Calling a MATLAB DLL in LabVIEW LV2014\exampleWrapper.c"
OBJ : C:\Users\SHUBHAM\AppData\Local\Temp\mex_36520060630497_19860\exampleWrapper.obj
OBJS : C:\Users\SHUBHAM\AppData\Local\Temp\mex_36520060630497_19860\exampleWrapper.obj
SRCROOT : D:\course\Calling a MATLAB DLL in LabVIEW LV2014\exampleWrapper
DEF : C:\Users\SHUBHAM\AppData\Local\Temp\mex_36520060630497_19860\exampleWrapper.def
EXP : "exampleWrapper.exp"
LIB : "exampleWrapper.lib"
EXE : exampleWrapper.exe
ILK : "exampleWrapper.ilk"
MANIFEST : "exampleWrapper.exe.manifest"
TEMPNAME : exampleWrapper
EXEDIR :
EXENAME : exampleWrapper
OPTIM : -O2 -DNDEBUG
LINKOPTIM :
-------------------------------------------------------------------
Building with 'Microsoft Visual C++ 2017 (C)'.
cl /c -MD -Zp8 -GR -W3 -EHsc- -Zc:wchar_t- -nologo -O2 -DNDEBUG /DMATLAB_DEFAULT_RELEASE=R2017b /DUSE_MEX_CMD /DMSVC /DIBMPC /D_CRT_SECURE_NO_DEPRECATE -I"D:\Program Files\MATLAB\R2020a\extern\include" -I"D:\Program Files\MATLAB\R2020a\extern\include\win64" "D:\course\Calling a MATLAB DLL in LabVIEW LV2014\exampleWrapper.c" /FoC:\Users\SHUBHAM\AppData\Local\Temp\mex_36520060630497_19860\exampleWrapper.obj
exampleWrapper.c

link "/nologo /manifest /DLL -called_from_matlab C:\Users\SHUBHAM\AppData\Local\Temp\mex_36520060630497_19860\exampleWrapper.obj exampleScript.lib /MACHINE:AMD64 /LIBPATH:"D:\Program Files\MATLAB\R2020a\extern\lib\win64\microsoft" mclmcrrt.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /out:exampleWrapper.exe
Error using mbuild (line 166)
Unable to complete successfully.
The command 'link' exited with a return value '1'

gptshubham595
Member
Member
on

Running that in a single line solved this issue 😂

 

mbuild -v exampleWrapper.c exampleScript.lib LINKFLAGS="$LINKFLAGS /DLL /DEF:exampleWrapper.def" LDEXT=".dll" CMDLINE250="mt -outputresource:$EXE';'2 -manifest $MANIFEST"

JoseRivero
Member
Member
on

Hello, I am on the LabVIEW side of this example. While I used your files as a sample guide, I stumbled with the same result. A few question. Say someone else came up with the Matlab dlls and just provided the files in a zip file (just as it happened in this post). I am to use the library wizard from LabVIEW to generate the library for it, do I need at all Matlab or a Matlab runtime in the my PC to end up with a working LabVIEW library? I assume not.

Below is a snippet of the library generated with the wizard using the steps provided in this post. Twice I reached the same result. You'll see here the generated library, the broken arrow after importing and saving the exampleScript.dll and the error from LabVIEW stating that the library couldn't be loaded. I checked the function configuration and it is pointing to the dll in the correct userlib directory. 

 

What could be missing? 

 

DLL Library Generation.jpg

labviewn00b4
Member
Member
on

Hi, 

I have the same issue as JoseRivero when I try and just run the example I find the same issue.

 

Any advice?

 

 

EfeboNaval
Member
Member
on

Dear croohcifer,

 

I managed to make the example of the material available, however, I have a query, how can I make the wrapper.c file in case the .m function has multiple inputs and multiple outputs?

 

Best Regards.

Contributors