Как можно использовать последнюю версию GCC (4.6) вместе с Qt под Mac OS? - PullRequest
9 голосов
/ 06 июня 2011

Моя проблема связана с обсуждаемой здесь:

Есть ли способ, которым OpenMP может работать на потоковых потоках Qt?

После попытки запустить мой Qtпрограмма под Mac OS, имеющая условие OpenMP во вторичном потоке, потерпела крах.После просмотра веб-страниц теперь я понимаю, что это вызвано ошибкой в ​​довольно старой версии (4.2) gcc, поставляемой Apple.

Затем я скачал последнюю версию 4.6 gcc из http://hpc.sourceforge.net и попытался скомпилировать проект, но я получил следующие ошибки от компилятора g ++:

нераспознанная опция '-arch' нераспознанная опция '-Xarch_x86_64'

Я узнал, что это потому, что этиявляются параметрами, которые могут интерпретироваться только настраиваемым компилятором Apple-gcc, но не стандартным gcc.

Может кто-нибудь помочь мне, могу ли я решить эту проблему и настроить g ++ 4.6 для использования с Qt, чтобы получить безошибочную поддержку OpenMP?Я признаю, что я новичок на платформе Mac OS в отношении компиляторов и программирования и хотел бы перенести мой код из среды Visual Studio-Qt.

Большое спасибо заранее!

Ответы [ 4 ]

2 голосов
/ 04 сентября 2012

Если вы не боитесь возиться с установкой Qt, измените запись QMAKE_CFLAGS_X86_64 в ~ / QtSDK / Desktop / Qt / 4.8.1 / gcc / mkspecs / common / g ++ - macx.conf.

Заменить '-Xarch_x86_64' на '-arch x86_64'.

1 голос
/ 20 июня 2011

Вы можете использовать не-Apple gcc v4.6 и скомпилировать двоичный файл для каждой архитектуры, которую вы хотите построить (использовать --target = $ {ARCH} должно быть хорошо для i386 и x86_64). Затем, когда у вас есть двоичный файл для каждой из архитектур, используйте lipo следующим образом: lipo -create -arch i386 binary_32bit -arch x86_64 binary_64bit -output binary_universal Это создаст толстый двоичный файл (он же универсальный двоичный файл) с именем binary_universal из binary_32bit и binary_64bit.

Или вы можете использовать clang / llvm вместо gcc, который, вероятно, не будет содержать описанную вами ошибку, и (если она предоставляется через инструменты разработчика Apple) сможет напрямую компилировать универсальные двоичные файлы.

0 голосов
/ 02 марта 2012

Lipo действительно может использоваться для объединения нескольких объектных файлов в «толстый» объектный файл, фактически оказывается, что это именно то, что делает компилятор Apple.Их компилятор GCC на самом деле является драйвером, который отображает различные архитектуры на соответствующий компилятор для архитектуры, а затем объединяет объекты вместе, используя lipo.

см .: http://lists.macosforge.org/pipermail/macports-dev/2011-September/016210.html

Вот исходный файл для этого драйвера:

http://opensource.apple.com/source/gcc/gcc-5666.3/driverdriver.c

Все, что нужно сделать, чтобы получить новыйВерсия GCC для соблюдения флага -arch состоит в том, чтобы модифицировать этот драйвер и заставить его указывать на оболочку сценария для вашей версии gcc, которая добавляет соответствующие флаги для данной архитектуры и затем передает все остальные аргументы.Примерно так:

#! / Bin / sh

/ opt / local / bin / gcc-mp-4.6 -m32 $ @

и

#! / bin / sh

/ opt / local / bin / gcc-mp-4.6 -m64 $ @

Вот ссылка, которая рассказывает о том, как это сделать, и предоставляетПроект cmake, позволяющий легко исправить версию GCC для macports и поддерживать флаг -arch для двух архитектур Intel:

http://thecoderslife.blogspot.com/2015/07/building-with-gcc-46-and-xcode-4.html

0 голосов
/ 22 июня 2011

Вы должны запустить qmake с соответствующей опцией -spec, например, чтобы использовать gcc46 на freebsd, необходимо запустить qmake так: qmake --spec = freebsd-g ++ 46

...