OpenMP не доступен на Mac с GCC 4.9

На сайте OpenMP говорится: "GCC 4.9 поддерживает OpenMP 4.0 для C/C++".

Я использую gcc 4.9.1 из brew, но я вижу эту ошибку, когда пытаюсь скомпилировать liblinear: omp.h file not found,

В частности:

Compiling liblinear version 1.93
Source code page:
   http://www.csie.ntu.edu.tw/~cjlin/liblinear/
external/liblinear-1.93_multicore/matlab/train.cpp:7:10: fatal error: 'omp.h' file not found
#include <omp.h>
         ^
1 error generated.

    mex: compile of ' "external/liblinear-1.93_multicore/matlab/train.cpp"' failed.

Вот код Matlab, используемый для компиляции liblinear, который содержит файл, который содержит #include <omp.h>:

% Compile liblinear
if ~exist('liblinear_train')
  fprintf('Compiling liblinear version 1.93\n');
  fprintf('Source code page:\n');
  fprintf('   http://www.csie.ntu.edu.tw/~cjlin/liblinear/\n');

  mex -outdir bin ...
      COMPFLAGS="$COMPFLAGS -fopenmp" -largeArrayDims ...
      external/liblinear-1.93_multicore/matlab/train.cpp ...
      external/liblinear-1.93_multicore/matlab/linear_model_matlab.cpp ...
      external/liblinear-1.93_multicore/linear.cpp ...
      external/liblinear-1.93_multicore/tron.cpp ...
      "external/liblinear-1.93_multicore/blas/*.c" ...
      -output liblinear_train;
end`

ОБНОВИТЬ

Я изменил версию gcc в mexopts.sh (примечание: я скопировал его из /Applications/MATLAB_R2013a_Student.app/bin/mexopts.sh в ~/.matlab/R2013a). Конкретно я поменял CC=xcrun -sdk macosx10.9 clang в CC='gcc-4.9',

Я думаю, что Matlab действительно использует этот компилятор, потому что, когда я запускаю этот код:

if ~exist('anigauss')
    fprintf('Compiling the anisotropic gauss filtering of:\n');
    fprintf('   J. Geusebroek, A. Smeulders, and J. van de Weijer\n');
    fprintf('   Fast anisotropic gauss filtering\n');
    fprintf('   IEEE Transactions on Image Processing, 2003\n');
    fprintf('Source code/Project page:\n');
    fprintf('   http://staff.science.uva.nl/~mark/downloads.html#anigauss\n\n');
    mex -Dchar16_t=uint16_T -outdir bin ...
        selective_search/SelectiveSearchCodeIJCV/Dependencies/anigaussm/anigauss_mex.c ...
        selective_search/SelectiveSearchCodeIJCV/Dependencies/anigaussm/anigauss.c ...
        -output anigauss
end

Matlab печатает:

dyld: Library not loaded: /usr/local/opt/mpfr2/lib/libmpfr.1.dylib
  Referenced from: /usr/local/Cellar/gcc49/4.9.1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.1/cc1
  Reason: Incompatible library version: cc1 requires version 4.0.0 or later, but libmpfr.1.dylib provides version 3.0.0
gcc-4.9: internal compiler error: Trace/BPT trap: 5 (program cc1)
/Applications/MATLAB_R2013a_Student.app/bin/mex: line 1343: 77128 Abort trap: 6           gcc-4.9 -c -I/Applications/MATLAB_R2013a_Student.app/extern/include -I/Applications/MATLAB_R2013a_Student.app/simulink/include -DMATLAB_MEX_FILE -fno-common -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -mmacosx-version-min=10.9 -fexceptions -Dchar16_t=uint16_T -DMX_COMPAT_32 -O2 -DNDEBUG "selective_search/SelectiveSearchCodeIJCV/Dependencies/anigaussm/anigauss_mex.c" -o bin/anigauss_mex.o

    mex: compile of ' "selective_search/SelectiveSearchCodeIJCV/Dependencies/anigaussm/anigauss_mex.c"' failed.

Тем не менее, когда я пытаюсь скомпилировать liblinear, я получаю то же сообщение об ошибке, что и обычно.

1 ответ

COMPFLAGS="$COMPFLAGS /openmp" -largeArrayDims ...
                      ^^^^^^^

Вероятно, это было написано для Microsoft Visual C/C++ или для Intel C/C++ Compiler в Windows. Системы Unix, включая OS X, традиционно используют - обозначить флаги командной строки.

Чтобы включить поддержку OpenMP в GCC, вы должны изменить /openmp в -fopenmp в флагах компилятора COMPFLAGS,


Похоже, что в дополнение к неправильному флагу OpenMP, mex использует неправильный компилятор. Сравните выходные данные ошибок от GCC и Clang:

НКУ

foo.c:1:25: fatal error: nonexistent.h: No such file or directory
 #include <nonexistent.h>
                         ^
compilation terminated.

лязг

foo.c:1:10: fatal error: 'nonexistent.h' file not found
#include <nonexistent.h>
         ^
1 error generated.

Clang или, по крайней мере, версия, поставляемая Apple с Xcode, не поддерживает OpenMP. Обратитесь к документации MATLAB для mex Команда о том, как выбрать другой компилятор. По сути, вы должны выполнить:

mex -setup

Если MATLAB обнаружит несколько используемых компиляторов, он должен предоставить вам возможность выбрать один из них. К сожалению, согласно этой таблице, MATLAB может не поддерживать GCC в OS X (по крайней мере, он не указан в таблице).

Другие вопросы по тегам