Skip to main content
Skip table of contents

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:

  1. A modern Linux or macOS system

  2. A C compiler (gcc, e.g., build-essential on Debian/Ubuntu, Xcode on macOS)

  3. 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 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.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.