web-dev-qa-db-fra.com

Erreur lors de l'activation de openmp - "ld: bibliothèque introuvable pour -lgomp" et erreurs Clang

J'essaie d'obtenir openmp pour qu'il s'exécute dans mon programme sur Mavericks, cependant quand j'essaye de compiler en utilisant le drapeau -fopenmp J'obtiens l'erreur suivante:

ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)

La commande que j'exécute est:

gcc myProgram.cpp -fopenmp -o myProgram

De plus, lorsque je lance gcc, je reçois des avertissements Clang que je trouve très étranges. Et en regardant dans/usr/bin/gcc, il ne semble pas être lié à Clang.

Des suggestions sur la façon de corriger mes erreurs Clang et de compiler openmp?

28
Davy Li

La commande gcc dans la dernière suite Xcode n'est plus l'interface GCC vers LLVM (basée sur le très ancien GCC 4.2.1) mais plutôt un lien symbolique vers clang. Clang ne prend pas (encore) en charge OpenMP. Vous devez installer séparément une autre version de GCC, par ex. en suivant ce tutoriel ou en utilisant l'un des systèmes de gestion de progiciels disponibles comme MacPorts et Homebrew .

27
Hristo Iliev

J'ai récemment attaqué ce problème et j'ai écrit le processus pour que tout fonctionne en fonction de instructions officielles .

Le script téléchargera tout dans ~/code pour une maintenance facile et ajoutera les variables d'environnement correctes à votre fichier ~/.profile. Pour les utilisateurs avancés, choisissez un emplacement de Nice dans lequel vous souhaitez installer la bibliothèque, le bac et l'inclusion et déplacez-les manuellement. Le script dépend de la connaissance du dernier runtime OpenMP d'Intel, qui peut être modifié en haut du script.

Le script devrait fonctionner hors de la boîte avec Vanilla Mavericks, à l'exception d'un petit problème. Dans le script make OpenML runtime, il n'accepte pas de manière fiable clang lorsqu'il est spécifié et continue avec le GCC par défaut. En tant que tel, si vous n'avez pas installé GCC (ce qui n'est pas normal sur les Mavericks prêts à l'emploi), il ne parviendra pas à se construire. Pour résoudre ce problème, vous devez mettre en commentaire deux lignes (comme indiqué dans le script) basées sur la version libomp_20131209_oss.tgz d'OpenMP. Les versions plus récentes d'OpenML peuvent briser ce script, alors utilisez-le à vos risques et périls sur les versions plus récentes.

Enregistrez simplement ce script dans un fichier, exécutez 'chmod + x filename.sh' et exécutez './filename.sh' à partir du terminal. Il faudra du temps pour construire LLVM et Clang, alors soyez patient.

EDIT: Ce script échouera très probablement sur Yosemite et j'ai des problèmes avec le clang2 intégré après la mise à jour des versions de développement d'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's clang"
13
Jason Parham

Si vous exécutez homebrew vous pouvez résoudre ce problème en appelant:

brew install clang-omp

Le compilateur sera disponible sous clang-omp++ Nom

5
Anvaka

Je viens de résoudre ce problème. Voici la réponse et comment le faire fonctionner avec Xcode.

  1. Récupérez la dernière version de la bibliothèque d'exécution openMP sur https://www.openmprtl.org/download

  2. décompressez et compilez-le par

    mkdir build && cd build && cmake ..
    
  3. installez-le par

    Sudo cp ./libiomp5.dylib /usr/lib/
    Sudo cp ./omp.h /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/
    
  4. Récupérez openmp/clang depuis Git en suivant les instructions sur http://clang-omp.github.io/

  5. compiler openmp/clang

    cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
    Sudo make install
    
  6. normalement, il installerait clang/clang ++ dans/usr/local/bin, nous devons remplacer le Apple clang par notre version

    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 * ../../
    
  7. Créez un projet dans Xcode, en utilisant le code Hello World sur le site Web de clang-openmp pour le test. Une fois créé, ajoutez "-fopenmp" aux indicateurs de compilateur personnalisés -> Autres indicateurs C dans les paramètres du projet; ajouter /usr/lib/libiomp5.dylib aux phases de construction du projet (paramètres du projet -> Phases de construction -> Faites glisser /usr/lib/libiomp5.dylib dans Link Binary avec les bibliothèques)

  8. Ça devrait marcher. Yosemite + Xcode 6 est testé.

Remarque: le clang personnalisé n'est PAS aussi stable que celui d'Apple. Revenez en arrière si vous rencontrez une erreur d'instruction étrange après la compilation.

3
Raymond