2013-02-28 3 views
7

Я только что обновился до OS X 10.8 «Mountain Lion», и я начинаю сожалеть о том, что сделал это.OS X 10.8, llvm, OpenMP с CMake

Я больше не могу построить мой (простой) параллельный код, который использует OpenMP.

При взгляде сюда и там я понял, что Apple больше не использует «gcc», а «llvm» - вполне вероятно, из-за проблем с лицензией. К сожалению, llvm не поддерживает (пока?) Поддержку OpenMP.

Я не могу поверить, что многие программы на основе OpenMP больше не будут запускаться в OS X, поэтому мой вопрос: как включить OpenMP в Mountain Lion?

После прочтения отличного ответа Христо Ильева, я думаю, что пропал больше, чем я изначально думал.

Я не использую XCode. Здание основано на CMake и make/gcc. Вчера я установил gcc 4.2 через macports, но - на сегодняшний день - мой код все еще находится в исходной форме, потому что по некоторым странным причинам я не могу переключить компиляцию на gcc (те же ошибки, связанные с OpenMP).

Проблема в том, что CMake продолжает использовать компилятор llvm. В корневой CMakeLists.txt я добавил следующие две строки:

set(CMAKE_C_COMPILER "/opt/local/bin/gcc-apple-4.2") 
set(CMAKE_CXX_COMPILER "/opt/local/bin/gcc-apple-4.2") 

и я также добавил две среды переменные:

export CXX=/opt/local/bin/gcc-apple-4.2 
export CC=/opt/local/bin/gcc-apple-4.2 

Когда CMake пытается найти OpenMP (FIND_PACKAGE (OpenMP)) Я получаю следующий вывод:

-- The compiler is /opt/local/bin/gcc-apple-4.2 
-- Try OpenMP C flag = [-fopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
[...] 
CMake Error at /opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message): 
Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS) 
Call Stack (most recent call first): 
/opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291 (_FPHSA_FAILURE_MESSAGE) 
/opt/local/share/cmake-2.8/Modules/FindOpenMP.cmake:159 (find_package_handle_standard_args) 
demo/CMakeLists.txt:8 (FIND_PACKAGE) 

Я попытался запустить /opt/local/bin/gcc-apple-4.2 вручную, и это не удается из-за отсутствующего libgomp.

С уважением

+1

Вы можете просто установить gcc на 10.8: http://stackoverflow.com/questions/9353444/how-to-use-install-gcc-on-mac-os-x-10-8-xcode-4-4 –

+1

Я нашел этот вопрос, но он был связан с установкой инструментов командной строки. Теперь я видел ответ, связанный с установкой реального gcc. Спасибо. –

+0

Вам не нужно было добавлять GCC 4.2 из macports, поскольку он поставляется с инструментами командной строки XCode. Вам нужно только [установить их дополнительно из GUI] (http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_3.html). Тем не менее, поскольку вы не используете XCode, я бы настоятельно рекомендовал вам создать собственный GCC 4.7.2 - самый последний и самый лучший с поддержкой функций OpenMP 3.1 :) –

ответ

11

LLVM является основой компилятор, который Apple, широко использует в OS X (в первую очередь в реализации OpenGL), а не сам компилятор. В Xcode есть два интерфейса LLVM: старый GCC-код llvm-gcc (который поддерживает OpenMP 2.5) и новый clang (который не поддерживает OpenMP). clang имеет обширные возможности анализа статического кода, а также гораздо более приятную отчетность об ошибках, особенно с кодом на C++. В основном это причина, по которой Apple инвестирует в нее и уходит от GCC (проект FreeBSD, с другой стороны, пытается заменить GCC на clang по причинам, связанным с лицензией). Существует текущий проект clomp (не ошибиться с Cluster OpenMP от Intel), который стремится создать версию с поддержкой OpenMP clang, но она далека от зрелой.

Если вам не нужны новые конструкции OpenMP, такие как явные задачи, и вы можете жить с некоторыми bugs, вы все равно можете использовать старый интерфейс GCC. Просто включите набор компилятора в настройках проекта в LLVM GCC 4.2:

Compiler suite chooser

Это один основан на действительно древней GCC 4.2.1 и больше не кажется развиваться. Если вам нужна более новая версия GCC, просто build one. К сожалению, я не могу предоставить вам информацию о том, как интегрировать его в Xcode. Он работает для меня в командной строке с GCC 4.7.1 и OS X 10.8.2 (и я не очень часто использую Xcode).

4

Просто добавьте несколько слов к отличному ответу Кристо: вы можете установить gcc через MacPorts. Это намного проще, чем компилировать все вручную (и компиляция gcc с нуля может быть действительно нетривиальной задачей из-за зависимостей и т. Д.).

Итак, установите MacPorts, сделайте «sudo port install gcc47», подождите несколько часов, и вы закончите с gcc-mp-4.7, который сможет скомпилировать ваш код OpenMP.

+3

Он также доступен в доморощенных. – FreeNickname

+6

для поддержки OpenMP используйте '$ brew install gcc --without-multilib' –

Смежные вопросы