Ошибка включения openmp - "ld: библиотека не найдена для -lgomp" и Clang errors
Я пытаюсь запустить openmp в моей программе на Mavericks, однако, когда я пытаюсь скомпилировать с использованием флага -fopenmp
, я получаю следующую ошибку:
ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Я выполняю команду:
gcc myProgram.cpp -fopenmp -o myProgram
Кроме того, когда я запускаю gcc, я получаю предупреждения Clang, которые я нахожу очень странными. И, глядя в /usr/bin/gcc, он не ссылается на Clang.
Любые предложения о том, как исправить мои ошибки Clang и получить openmp для компиляции?
Ответы
Ответ 1
Команда gcc
в последнем пакете Xcode больше не является интерфейсом GCC для LLVM (на основе самого старого GCC 4.2.1), а скорее символической ссылкой на clang
. Clang еще не поддерживает OpenMP. Вы должны установить отдельно другую версию GCC, например. следуя этому руководству или используя любую из доступных систем управления пакетами программного обеспечения, таких как MacPorts и Homebrew.
Ответ 2
Я только недавно напал на эту проблему и написал сценарий процесса получения всего работающего на основе официальных официальных инструкций.
script загрузит все в ~/код для упрощения обслуживания и добавит правильные переменные среды в файл ~/.profile. Для продвинутых пользователей выберите подходящее место, в которое вы хотите установить библиотеку, bin и включить и переместить их вручную. script зависит от знания последней версии среды OpenMP от Intel, которая может быть изменена в верхней части script.
script должен работать из коробки с ванильными мавериками, за исключением одной маленькой проблемы. В среде выполнения OpenML make script он не надежно принимает clang при указании и продолжает с GCC по умолчанию. Таким образом, если у вас нет GCC (который не является обычным явлением из коробки Mavericks), он не сможет построить. Чтобы исправить это, вы должны прокомментировать две строки (как указано в script) на основе сборки libomp_20131209_oss.tgz OpenMP. Новые сборки OpenML могут сломать этот script, поэтому используйте свои собственные угрозы в более новых версиях.
Просто сохраните этот script в файл, запустите 'chmod + x filename.sh' и запустите './filename.sh' из терминала. Для создания LLVM и Clang потребуется некоторое время, поэтому будьте терпеливы.
EDIT: этот script, скорее всего, не сработает на Yosemite, и у меня возникнут проблемы с использованием встроенного clang2 после обновления в dev-сборки OSX 10.10.
INTEL_OPENMP_LATEST_BUILD_LINK=https://www.openmprtl.org/sites/default/files/libomp_20131209_oss.tgz
DEST_FOLDER = ~/code
CLANG_INCLUDE=${DEST_FOLDER}/llvm/include
CLANG_BIN=${DEST_FOLDER}/llvm/build/Debug+Asserts/bin
CLANG_LIB=${DEST_FOLDER}/llvm/build/Debug+Asserts/lib
OPENMP_INCLUDE=${DEST_FOLDER}/libomp_oss/exports/common/include
OPENMP_LIB=${DEST_FOLDER}/libomp_oss/exports/mac_32e/lib.thin
mkdir ${DEST_FOLDER}
cd ${DEST_FOLDER}
git clone https://github.com/clang-omp/llvm
git clone https://github.com/clang-omp/compiler-rt llvm/projects/compiler-rt
git clone -b clang-omp https://github.com/clang-omp/clang llvm/tools/clang
cd llvm
mkdir build
cd build
../configure
make
cd Debug+Asserts/bin
mv clang clang2
rm -rf clang++
ln -s clang2 clang2++
echo "LLVM+Clang+OpenMP Include Path : " ${CLANG_INCLUDE}
echo "LLVM+Clang+OpenMP Bin Path : " ${CLANG_BIN}
echo "LLVM+Clang+OpenMP Lib Path : " ${CLANG_LIB}
cd ${DEST_FOLDER}
curl ${INTEL_OPENMP_LATEST_BUILD_LINK} -o libomp_oss_temp.tgz
gunzip -c libomp_oss_temp.tgz | tar xopf -
rm -rf libomp_oss_temp.tgz
cd libomp_oss
echo "You need to do one or two things:"
echo "1.) [Required] Comment out line 433 from libomp_oss/src/makefile.mk"
echo "2.) [Optional] If you do not have GCC installed (not normal on vanilla Mavericks), you must comment out lines 450-451 in libomp_oss/tools/check-tools.pl. Have you done this or want to compile anyway?"
select yn in "Yes" "No"; do
case $yn in
Yes ) make compiler=clang; break;;
No ) exit;;
esac
done
echo "OpenMP Runtime Include Path : " ${OPENMP_INCLUDE}
echo "OpenMP Runtime Lib Path : " ${OPENMP_LIB}
(echo 'export PATH='${CLANG_BIN}':$PATH';
echo 'export C_INCLUDE_PATH='${CLANG_INCLUDE}':'${OPENMP_INCLUDE}':$C_INCLUDE_PATH';
echo 'export CPLUS_INCLUDE_PATH='${CLANG_INCLUDE}':'${OPENMP_INCLUDE}':$CPLUS_INCLUDE_PATH';
echo 'export LIBRARY_PATH='${CLANG_LIB}':'${OPENMP_LIB}':$LIBRARY_PATH';
echo 'export DYLD_LIBRARY_PATH='${CLANG_LIB}':'${OPENMP_LIB}':$DYLD_LIBRARY_PATH}') >> ~/.profile
source ~/.profile
echo "LLVM+Clang+OpenMP is now accessible through [ clang2 ] via terminal and does not conflict with Apple clang"
Ответ 3
Если вы используете homebrew, вы можете решить эту проблему, вызвав:
brew install clang-omp
Компилятор будет доступен под clang-omp++
name
Ответ 4
Просто справился с этой проблемой. Здесь ответ плюс, как заставить его работать с Xcode.
-
Возьмите последнюю версию библиотеки времени выполнения OpenMP из
https://www.openmprtl.org/download
-
распаковать и скомпилировать его
mkdir build && cd build && cmake ..
-
установите его
sudo cp ./libiomp5.dylib /usr/lib/
sudo cp ./omp.h /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/
-
Захватите openmp/clang из Git следуя инструкциям http://clang-omp.github.io/
-
скомпилировать openmp/clang
cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
sudo make install
-
обычно он установил clang/clang++ в /usr/local/bin, нам нужно заменить Apple clang нашей версией
cd /usr/bin
sudo mv clang clang-apple
sudo mv clang++ clang++-apple
sudo ln -s /usr/local/bin/clang ./clang
sudo ln -s /usr/local/bin/clang++ ./clang++
cd /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
sudo mv clang clang-apple
sudo mv clang++ clang++-apple
sudo ln -s /usr/local/bin/clang ./clang
sudo ln -s /usr/local/bin/clang++ ./clang++
cd /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
sudo mv -f * ../../
-
Создайте проект в Xcode, используя код Hello World на веб-сайте clang-openmp для тестирования. После создания добавьте "-fopenmp" в флаги пользовательского компилятора → Другие флаги C в настройках проекта; добавьте /usr/lib/libiomp5.dylib
к этапам сборки проекта (параметры проекта → Сборка фаз → Перетащите /usr/lib/libiomp5.dylib
в бинарную ссылку с библиотеками)
-
Он должен работать. Yosemite + Xcode 6 протестирован.
Примечание: пользовательский clang не так стабилен, как Apple. Отключитесь, если вы встретите странную ошибку команды после компиляции.