Exodriver Downloads (for UD-series Linux and macOS support)
The Exodriver (also known as liblabjackusb) is a thin interface (think exoskeleton) to LabJack UD series devices. It’s written as a C library that uses libusb-1.0 for USB communication. The library can open, close, read from, and write to any LabJack device via USB. Because it’s a library and doesn’t have any kernel code, it is easy to build.
Which Software do I need for my LabJack?
U3, U6, and UE9: Exodriver is the low-level driver for macOS and Linux. For Windows, the UD library is an easier-to-use, high-level library.
T7 and T4: Use the LJM Library, which is an easier-to-use, high-level library for Windows/Linux/macOS.
U12: For Windows, see our U12 Windows Installer. The ljacklm library is an easier-to-use, high-level driver for Linux and macOS (10.15.4 or older macOS versions only). ljacklm requires the Exodriver.
See also: what software to use for which device.
Exodriver Prerequisites
First, make sure the following requirements are met:
A modern Linux or macOS system
A C compiler (gcc, e.g., build-essential on Debian/Ubuntu, Xcode on macOS)
libusb-1.0 library and header files installed (from the source or -dev binary packages)
Next, see the appropriate downloads and build instructions for your operating system below.
Subsections
Exodriver (liblabjackusb) Downloads
Exodriver source code and C/C++ examples (← click to download)
Other Downloads and Resources
Exodriver on GitHub - Git repository of source code and C/C++ examples.
Exodriver_NativeUSB_Setup.zip - macOS and x86_64 only installer for the pre-built Exodriver binaries. Signed and notarized. Note: not Apple Silicon (M1 chip) compatible. See the in-depth build instructions for macOS if you have a Mac using Apple Silicon (M1 and newer).
macOS Installation Notes
Intel based macOS users can use the pre-built installer (click to download) rather than building the Exodriver from the source. Users with newer Apple silicon based devices (M1 and later) must build from source as detailed in the following section.
We also provide a simple Xcode project (click to download) if you would like to use Xcode to build LabJack applications with the Exodriver. C language examples are provided with the Exodriver’s source code.
For U12 users: Only macOS 10.15.4 and earlier versions are supported. Use the “Customize install” option of the pre-built installer to add the LabJackHID kernel extension. This is a null kernel extension which prevents the OS’s HID driver from claiming a LabJack HID device.
In-depth macOS Build Instructions
This section describes how to build the Exodriver from source.
Download Xcode and install it if you don’t have it already.
libusb-1.0 is required by the Exodriver and can be built from the libusb source. Download the source from GitHub. Version 1.0.26 is the latest as of January 2023. Build it in the standard way:
$ tar xvfj libusb-1.0.26.tar.bz2
$ cd libusb-1.0.26/
$ ./configure
$ make
$ make check
$ sudo make install
In some older libusb-1.0 versions the configuration step is done with "./autogen.sh" instead of "./configure".
Download and install the Exodriver:
$ git clone https://github.com/labjack/exodriver.git
$ cd exodriver/
$ sudo ./install.sh
Issues with /usr/local/lib permissions
Some users on newer Mac devices have reported issues with permissions to the /usr/local/lib directory (where the Exodriver shared library is downloaded to). The following command should result in a permissions error after installing the Exodriver if there is a permissions issue. Otherwise, it should return information about your Exodriver shared library file:
$ file /usr/local/lib/liblabjackusb.dylib
If you get an error such as permission denied
, make sure that your user has read and execute permissions on /usr/local/lib/liblabjackusb.dylib
. These permissions could be applied with a recursive chmod
command like the following (note: use caution when running commands with sudo
):
Add read and execute permissions to the Exodriver shared library (liblabjackusb.dylib) - bash
$ sudo chmod +rx /usr/local/lib/liblabjackusb.dylib
Optional: Build a combined Arm and Intel 64-bit Exodriver on MacOS
Note: This section is only applicable to newer Arm64 based MacOS computers, M1 and greater while running native Intel x86_64 applications using Rosetta
These steps are generally not needed, but there are circumstances that require a combined arm and intel 64-bit Exodriver. You need both architectures when you get error messages like the one when running an application through Rosetta on an arm64 Mac.
Could not load the exodriver driver...tried: '/usr/local/lib/liblabjackusb.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64'))
In this case an Intel x86_64 process running through Rosetta on an Arm64 Mac tried to load exodriver but needs to load an x86_64 binary. This occurs because while running using Rosetta, a native x86_64 Mac application can run on an arm64 Mac but requires binaries that are also compiled as x86_64.
Verify this by running:
$ file /usr/local/lib/liblabjackusb.dylib
Output:
/usr/local/lib/liblabjackusb.dylib: Mach-O 64-bit dynamically linked shared library arm64
Normally, this is what you want. The programs you will use to call the Exodriver will also be compiled for arm64. The built-in Python on Mac OS, for example, is compiled for two architectures, including x86_64:
$ file /usr/bin/python3
Possible Output:
/usr/bin/python3: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/usr/bin/python3 (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/python3 (for architecture arm64e): Mach-O 64-bit executable arm64e
When you must load the Exodriver from an Intel x86_64-bit process, you must compile libusb-1.0 and the Exodriver to be combined arm/intel 64-bit libraries. Start with libusb-1.0
$ tar xvfj libusb-1.0.27.tar.bz2 $ cd libusb-1.0.27/ $ export CFLAGS="-arch x86_64 -arch arm64" $ ./configure --disable-dependency-tracking $ make $ sudo make install
Confirm it worked by running:
$ file /usr/local/lib/libusb-1.0.dylib
Possible Output:
/usr/local/lib/libusb-1.0.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
/usr/local/lib/libusb-1.0.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/usr/local/lib/libusb-1.0.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
After libusb-1.0 is installed correctly, move on to the Exodriver. Download the source link on GitHub. Find the Exodriver download directory
$ cd path/to/exodriver $ cd liblabjackusb/
Now edit the Makefile in a text editor to comment out (put a # sign in front of) this ARCHFLAGS line:
#ARCHFLAGS =
and uncomment (remove the # sign from) this ARCHFLAGS line below it:
ARCHFLAGS = -arch x86_64 -arch arm64
Now build and install the software
$ cd .. $ sudo ./install.sh
Verify that it worked by running:
$ file /usr/local/lib/liblabjackusb.dylib
Possible Output:
/usr/local/lib/liblabjackusb.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
/usr/local/lib/liblabjackusb.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/usr/local/lib/liblabjackusb.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
Because libusb-1.0 and the Exodriver are built for the x86_64 architecture, native Intel x86_64 applications running through Rosetta can load them.
Optional: Build a combined 32-bit and 64-bit Exodriver on macOS / Mac OS X
Note: This section is only applicable to older Intel based macOS computers. Most likely, you should not go through the following instructions.
These steps are generally not needed, but there are circumstances that require a combined 32-bit and 64-bit Exodriver. You need both architectures when you get error messages like the one in this LabJack forum topic
dlopen(liblabjackusb.dylib, 6): no suitable image found. Did find:
/usr/local/lib/liblabjackusb.dylib: mach-o, but wrong architecture
In this case, a 32-bit process tried to load a 64-bit Exodriver. Here’s how it happened: When following the instructions in the Quickstart, the compiler built a copy of the Exodriver for its native architecture. On modern Mac OS X systems, that’s x86_64 (64-bit). Verify this by running:
$ file /usr/local/lib/liblabjackusb.dylib
Output:
/usr/local/lib/liblabjackusb.dylib: Mach-O 64-bit dynamically linked shared library x86_64
Normally, this is what you want. The programs you will use to call the Exodriver will also be 64-bit. The built-in Python on Mac OS X, for example, is compiled for three architectures, including x86_64:
$ file /usr/bin/python
Possible Output:
/usr/bin/python: Mach-O universal binary with 3 architectures
/usr/bin/python (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386): Mach-O executable i386
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc
There are some programs on Mac OS X, though, that are not 64-bit (they’re i386 only), and they can’t load a 64-bit Exodriver. The Python download from python.org, for example, is 32-bit at the time of this writing. We recommend using the built-in Python on Mac OS X.
When you must load the Exodriver from a 32-bit process, you must compile libusb-1.0 and the Exodriver to be combined 32-/64-bit libraries. Start with libusb-1.0
$ tar xvfj libusb-1.0.19.tar.bz2
$ cd libusb-1.0.19/
$ export CFLAGS="-arch i386 -arch x86_64"
$ ./configure --disable-dependency-tracking
$ make
$ sudo make install
Confirm it worked by running:
$ file /usr/local/lib/libusb-1.0.dylib
Possible Output:
/usr/local/lib/libusb-1.0.dylib: Mach-O universal binary with 2 architectures
/usr/local/lib/libusb-1.0.dylib (for architecture i386): Mach-O dynamically linked shared library i386
/usr/local/lib/libusb-1.0.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
After libusb-1.0 is installed correctly, move on to the Exodriver. Download the source link on GitHub. Find the Exodriver download directory
$ cd path/to/exodriver
$ cd liblabjackusb/
Now edit the Makefile in a text editor to comment out (put a # sign in front of) this ARCHFLAGS line:
#ARCHFLAGS =
and uncomment (remove the # sign from) this ARCHFLAGS line two lines above it:
ARCHFLAGS = -arch i386 -arch x86_64
Now build and install the software
$ cd ..
$ sudo ./install.sh
Verify that it worked by running:
$ file /usr/local/lib/liblabjackusb.dylib
Possible Output:
/usr/local/lib/liblabjackusb.dylib: Mach-O universal binary with 2 architectures
/usr/local/lib/liblabjackusb.dylib (for architecture i386): Mach-O dynamically linked shared library i386
/usr/local/lib/liblabjackusb.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
Because libusb-1.0 and the Exodriver are built for the i386 architecture, 32-bit applications can load them.
In-depth Linux Build Instructions
Modern Linux distributions come with a binary release of libusb-1.0, so building the Exodriver is easier than ever. Install the dependencies with your package manager, checkout the Exodriver source code, and build/install it. Here are the complete steps when using Ubuntu or Debian based distributions:
$ sudo apt-get install build-essential
$ sudo apt-get install libusb-1.0-0-dev
$ sudo apt-get install git-core
$ git clone https://github.com/labjack/exodriver.git
$ cd exodriver/
$ sudo ./install.sh
For other non-Ubuntu and Debian based distributions, use their package manager and their libusb-1.0 development package name. For example, in Fedora the package manager is "yum" and the libusb-1.0 development package is "libusbx-devel".
It is recommended to use package managers for libusb-1.0 installation for system compatibility. If needed, libusb-1.0 can be built from the source. Download the source from GitHub. Version 1.0.23 is the latest as of August 2019. Build it in the standard way:
$ tar xvfj libusb-1.0.23.tar.bz2
$ cd libusb-1.0.23/
$ ./autogen.sh
$ make
$ sudo make install
In older libusb-1.0 versions and version 1.0.26, the configuration step is done with "./configure" instead of "./autogen.sh".
Additional Information
For more information on the build process, consult INSTALL.Linux or INSTALL.MacOSX. INSTALL.Linux details which kernel versions are required, and how to manually install the driver and set device permissions properly without the install.sh script. INSTALL.MacOSX lists which releases of macOS are supported.
Examples
After installing the Exodriver, you could build the U3, U6, or UE9 example programs:
$ cd examples/U6/ $ make
Run one of example programs like this:
$ ./u6BasicConfigU6
See Building Exodriver Programs.
We also have a Python wrapper that works with the Exodriver called LabJackPython.
Debugging
Here’s how to compile the Exodriver and libusb with debugging on. In the Exodriver source code’s labjackusb.c, find this line:#define LJ_DEBUG false
and change it to:
#define LJ_DEBUG true
Then rerun make and “sudo make install” as the INSTALL file describes. For libusb, rerun configure with this flag:
./configure --enable-debug-log
and rerun make
and sudo make install
.
These libraries will now produce copious output that may help you debug your application.
Known Issues
macOS
As of macOS 10.15, opening a U6 the first time after plugging it in sometimes fails. Subsequent attempts to open succeed.