Compiling MRtrix with Json for modern C++

Hello,

I am trying to install MRtrix on a CentOS HPC. I cannot use the conda pre-compiled version since I work with virtualenv and as much as I know they are mutually exclusive. Hence, I tried to compile it from the source.

However, when I run the configure script I get the result:

MRtrix build type requested: release version

Detecting OS: linux
Looking for compiler [clang++]: not found
Looking for compiler [g++]: g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Checking for C++11 compliance: ok
Checking shared library generation: ok
Detecting pointer size: 64 bit
Detecting byte order: little-endian
Checking for variable-length array support: ok
Checking for non-POD variable-length array support: ok
Checking for ::max_align_t: 16 bytes
Checking for std::max_align_t: not found
Checking for Eigen3 library: 3.3.9
Checking for Eigen3 Unsupported: Present
Checking for zlib compression library: 1.2.11
Checking for "JSON for Modern C++" requirements: 
ERROR: error compiling JSON for modern C++ application!

    MRtrix3 was unable to compile a test program involving JSON for modern C++.

  See the file 'configure.log' for details. If this doesn't help and you need
  further assistance, please post on the MRtrix3 community forum
  (http://community.mrtrix.org/), and make sure to include the full contents of
  the 'configure.log' file.

I looked at the log file and it is written:

REPORT: 1.2.11

REPORT: Checking for "JSON for Modern C++" requirements:

COMPILE /tmp/tmp8ni1ld_1.cpp:
---

#include "file/json.h"
int main (int argc, char* argv[])
{
  nlohmann::json json;
  json["key"] = "value";
}

---
EXEC <<
CMD: g++ -c -std=c++11 -DMRTRIX_BUILD_TYPE="release version" -pthread -fPIC -DMRTRIX_WORD64 -DMRTRIX_STD_MAX_ALIGN_T_NOT_DEFINED -DMRTRIX_HAVE_EIGEN_UNSUPPORTED_SPECIAL_FUNCTIONS -I/home/hers_ni/ycaspi/mrtrix3/core /tmp/tmp8ni1ld_1.cpp -o /tmp/tmp8ni1ld_1.o
EXIT: 1
STDERR:
In file included from /tmp/tmp8ni1ld_1.cpp:2:0:
/home/hers_ni/ycaspi/mrtrix3/core/file/json.h:66:10: error: #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
         #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
          ^
>>

error deleting temporary file "/tmp/tmp8ni1ld_1.o": No such file or directory
ERROR: error compiling JSON for modern C++ application!

I tried to compile JSON for modern C++ , but I do not know how to link it to the configure script.

I also know about the thread:

Installation Problem, JSON requirements | Windows - #21 by jdtournier

I tried to use the command:

LD_PRELOAD=/usr/local/lib64/libstdc++.so.6.0.21 MOC=/usr/bin/moc-qt5 QMAKE=/usr/bin/qmake-qt5 ./configure

With the libraries that I found on our HPC (qt4 instead of 5 and /libstdc++.so.6.0.19), but it still does not work.

Any ideas on how to solve the problem and compile MRtrix?

Best,
Yaron Caspi

The issue is that the compiler you’re using is too old. You’re using:

But you’ll note in our installation instructions, we require GCC >= 5 (or clang).

If you’re on a HPC cluster, there’s a good chance you can load a more recent compiler using e.g. module load gcc/10.2.0 (type module avail to list available versions). Note this assumes your HPC administrator use the environment modules system to manage its packages, but this might not be the case on your HPC. Get in touch with your sysadmin if that doesn’t work.

Thanks.

This indeed solved the problem.
I am trying to compile it now with the TIFF PNG and FFTW libraries.

We do not have them on the HPC so I compiled them.

However, when I try to set:

export TIFF_CFLAGS="-LPATH_TO_TIFF/lib -lz"

export TIFF_LINKFLAGS="-isystem PATH_TO_TIFF/include"

and similar for libpng and FFTW, it does not work.

what is the correct way to pass these flags to the configure script.

Thanks.
Yaron

Hi Yaron,

The way in which you are passing the relevant strings to the configure script is correct. It should be possible to verify this by looking the the log file generated by the configure script, and ensuring that the strings you have specified via those environment variables are being included in the compiler execution calls. The harder question is what the actual content of those environment variables should be. This is harder to figure out, as it depends both on the compiler and the nature of the library. E.g. You could try with and without the “/include” sub-directory to see if it makes a difference. You also want to check the log both with and without that addition to determine if it’s true that in both cases the library is simply not being found at all, or if when the correct library path is specified it is being found but some other error is being generated by the compiler, in which case the rectification looks entirely different.

Rob