2016-10-14 6 views
1

Я хочу скомпилировать mex-файлы без установки xcode, используя только средства командной строки (из яблочного центра разработчика).Matlab mex без xcode, но с автономными инструментами командной строки

Apple Command Line Tools устанавливает компилятор и добавляет в систему стандартные библиотеки и заголовки в пакете, который намного меньше, чем xcode (что составляет несколько ГБ).

Возможно выполнение Mex on linux - я не вижу причин, по которым Matlab mex должен требовать огромные SDK, необходимые для macos. Длинный вечер проб и ошибок и хакерских конфигурационных файлов не помог. Кто-нибудь имеет минимальный рабочий пример того, как скомпилировать mex-файл за пределами matlab, или простой способ использовать mex без установки xcode?

С наилучшими пожеланиями, Magnus

+0

Я думаю, вы можете установить 'gcc' из homebrew и по существу использовать тот же компилятор, что и linux. У меня есть и на моей машине, и я могу проверить позже, если Matlab сможет видеть и то, и другое. – mpaskov

+0

На самом деле я не думаю, что gcc поддерживается на Mac, я могу использовать только xcode, извините. – mpaskov

+0

Спасибо в любом случае! Как вы видите ниже, я нашел решение самостоятельно. – vindarmagnus

ответ

3

После тратить больше времени, я завелся обучение больше вещей и отвечая на мой собственный вопрос. Я отправлю свое решение здесь, если кому-то еще понадобится это в будущем.

Убедитесь, что шнур подключен к компьютеру и установлен MATLAB, а также установите инструменты командной строки из apple. Затем вызовите следующую Makefile для компиляции arrayProduct.c (поставляется с MATLAB) из терминала следующим образом:

make mex=arrayProduct 

Поместите этот Makefile код в той же папке, в файл с именем Makefile (редактирования для собственных нужд, если у вас есть к):

all: 
clang -c\ 
    -DMX_COMPAT_32 \ 
    -DMATLAB_MEX_FILE \ 
    -I"/Applications/MATLAB_R2016b.app/extern/include" \ 
    -I"/Applications/MATLAB_R2016b.app/simulink/include" \ 
    -fno-common \ 
    -arch x86_64 \ 
    -fexceptions \ 
    -O2 \ 
    -fwrapv \ 
    -DNDEBUG \ 
    "/Applications/MATLAB_R2016b.app/extern/version/c_mexapi_version.c" \ 
    $(mex).c 
clang \ 
    -Wl,-twolevel_namespace \ 
    -undefined error \ 
    -arch x86_64 \ 
    -bundle \ 
    -Wl,-exported_symbols_list,"/Applications/MATLAB_R2016b.app/extern/lib/maci64/mexFunction.map" \ 
    $(mex).o \ 
    c_mexapi_version.o \ 
    -O \ 
    -Wl,-exported_symbols_list,"/Applications/MATLAB_R2016b.app/extern/lib/maci64/c_exportsmexfileversion.map" \ 
    -L"/Applications/MATLAB_R2016b.app/bin/maci64" \ 
    -lmx \ 
    -lmex \ 
    -lmat \ 
    -lc++ \ 
    -o $(mex).mexmaci64 

Вышеуказанный make-файл является минимальным рабочим примером, вы должны отредактировать его в соответствии с вашими требованиями.

Edit: Вариант 2 Вы можете сделать MATLAB понять, как использовать инструменты командной строки путем редактирования файла XML, содержащий параметры компилятора вместо этого. Откройте файл, расположенный по адресу /Пользователь/имя пользователя/Библиотека/Поддержка приложений/MathWorks/MATLAB/R2016b/mex_C_maci64.xml

Удалить все параметры компилятора и компоновщика, связанные с ISYSROOT. Это заставит компилятор искать файлы заголовков в/usr/include и т. Д., А не в папке SDK в XCode.

+0

Спасибо, решение (вариант 2) работает на моей машине. – Eli4ph

1

Ну, у меня есть еще один вариант здесь: Редактировать файлы под /Applications/MATLAB_R2016b.app/bin/maci64/mexopts (возможно, файл 3.xml должен иметь такую ​​же модификацию).

Найдите часть <XCODE_AGREED_VERSION>, прокомментируйте весь тег xml, например.обернуть их <!-- и -->, как это:

<!--XCODE_AGREED_VERSION> 
      <and diagnostic="Xcode is installed, but its license has not been accepted. Run Xcode and accept its license agreement." > 
       <or> 
        <cmdReturns name="defaults read com.apple.dt.Xcode IDEXcodeVersionForAgreedToGMLicense"/> 
        <cmdReturns name="defaults read /Library/Preferences/com.apple.dt.Xcode IDEXcodeVersionForAgreedToGMLicense"/> 
       </or> 
       <cmdReturns name="&#10;agreed=$$ &#10; if echo $agreed | grep -E '[\.\&quot;]' >/dev/null; then &#10; lhs=`expr &quot;$agreed&quot; : '\([0-9]*\)[\.].*'` &#10; rhs=`expr &quot;$agreed&quot; : '[0-9]*[\.]\(.*\)$'` &#10; if echo $rhs | grep -E '[\.&quot;]' >/dev/null; then &#10; rhs=`expr &quot;$rhs&quot; : '\([0-9]*\)[\.].*'` &#10; fi &#10; if [ $lhs -gt 4 ] || ([ $lhs -eq 4 ] &amp;&amp; [ $rhs -ge 3 ]); then &#10; echo $agreed &#10; else &#10; exit 1&#10; fi &#10; fi" /> 
      </and> 
     </XCODE_AGREED_VERSION --> 

Некоторые примечания:

  1. Эти файлы только для чтения по умолчанию, вам необходимо оформить sudo chmod 644 * в этом каталоге

  2. после закомментировать все необходимые файлы, введите эту команду в MATLAB: mex -setup C++

Тогда вы закончили

+0

Сделано, работает отлично! – Mapio