web-dev-qa-db-fra.com

Symboles OpenCV non définis pour l'architecture x86_64: erreur

avant que cela ne soit signalé comme une question répétée, veuillez lire la fin. Merci d'avoir regardé.

J'ai mis en place openCV en utilisant du breuvage maison.

Ce sont les commandes que j'ai utilisées:

brew tap homebrew/science
brew install opencv

J'utilise le fichier simple suivant que j'ai trouvé en ligne pour tester ma configuration:

// Example showing how to read and write images
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main(int argc, char** argv)
{   
    // Load an image from file - change this based on your image name
    Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);

    if(img.empty())
    {
        fprintf(stderr, "failed to load input image\n");
        return -1;
    }

    // this is just to show, that you won't have to pre-alloc
    // result-images with c++ any more..
    Mat gray;
    cvtColor(img,gray,CV_BGR2GRAY);

    // Write the image to a file with a different name,
    // using a different image format -- .png instead of .jpg
    if( ! imwrite("my_image_copy.png", img) )
    {
        fprintf(stderr, "failed to write image file\n");
    }

    // no need to release anything with c++ !   
    return 0;
}

Voici l'erreur que j'obtiens après avoir essayé de compiler et d'exécuter les poursuites g++ test.cpp -o test.

Undefined symbols for architecture x86_64:
  "cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:
      _main in test-41a30e.o
  "cv::namedWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
      _main in test-41a30e.o
  "cv::destroyWindow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      _main in test-41a30e.o
  "cv::Mat::deallocate()", referenced from:
      cv::Mat::release() in test-41a30e.o
  "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
      _main in test-41a30e.o
  "cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cv::_InputArray const&)", referenced from:
      _main in test-41a30e.o
  "cv::waitKey(int)", referenced from:
      _main in test-41a30e.o
  "cv::fastFree(void*)", referenced from:
      cv::Mat::~Mat() in test-41a30e.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

J'ai trouvé des problèmes similaires sur le débordement de la pile, mais aucun n'utilise homebrew et je ne sais pas à quel point le problème est sensible au temps (en ce qui concerne les mises à jour et les modifications d'OpenCV, de mon système d'exploitation, etc.). J'utilise un mac avec le système d'exploitation 10.9.4. De plus, ces réponses n'étaient pas vraiment claires pour moi sur ce qui devait être changé. Beaucoup ont simplement suggéré une ligne de code sans dire où la ligne devrait aller. Je suis extrêmement novice avec ces technologies. Toute aide serait super merci!

Edit: Mark Setchell a aidé avec le premier lot d'erreurs. Mais je reçois maintenant: g ++ $ (pkg-config --cflags --libs opencv) test.cpp -o Test & ./Test

[3] 7187 dyld: Bibliothèque non chargée: lib/libopencv_calib3d.2.4.dylib Référencé depuis: /usr/local/Cellar/opencv/2.4.9/include/./Test Reason: image introuvable [2] Terminé g ++ $ ( pkg-config --cflags --libs opencv) test.cpp -o Test Trace/BPT trap: 5

brewdoctor m'a donné cet avertissement: Avertissement: vous avez dissocié les fûts dans votre cave Le fait de laisser les fûts non liés peut entraîner des problèmes de construction et entraîner le dysfonctionnement des infusions qui dépendent de ces fûts une fois construites. Courir brew link sur ceux-ci:

opencv

J'ai donc exécuté le lien de brassage - écraser opencv mais j'ai obtenu ceci:

Linking /usr/local/Cellar/opencv/2.4.9... 
Error: Could not symlink include/opencv/cv.h

besoin de l'écraser parce que le lien de brassage opencv a donné

Linking /usr/local/Cellar/opencv/2.4.9... 
Error: Could not symlink include/opencv/cv.h
Target /usr/local/include/opencv/cv.h
already exists. You may want to remove it:
  rm /usr/local/include/opencv/cv.h
21
Bren

Vous obtenez des erreurs de l'éditeur de liens. Je pense que c'est parce que vous ne liez pas avec les bibliothèques correctes que opencv requiert.

Le moyen le plus simple d'obtenir les bibliothèques correctes est avec pkg-config, donc je recommanderais:

brew install pkg-config

Ensuite, vous devrez peut-être réinstaller opencv

brew reinstall opencv

ou peut-être

brew uninstall opencv
brew install opencv

Ensuite, vous devriez pouvoir faire:

g++ $(pkg-config --cflags --libs opencv) test.cpp -o Test 

Tu peux courir

pkg-config --cflags --libs opencv4

pour voir ce qu'il produit pour le g++ compilateur si vous êtes intéressé - il indique au compilateur où se trouvent les bibliothèques et les fichiers d'en-tête. Sur mon système, il génère ceci:

pkg-config --cflags --libs opencv4

-I/usr/local/Cellar/opencv/2.4.12_2/include/opencv \
-I/usr/local/Cellar/opencv/2.4.12_2/include \
-L/usr/local/Cellar/opencv/2.4.12_2/lib \
-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab

Si vous n'êtes pas familier avec pkgconfig, vous pouvez lui demander de vous dire tous les paquets qu'il connaît comme ceci:

pkg-config --list-all

Mon système donne une sortie comme celle-ci:

libzmq                              libzmq - 0MQ c++ library
gio-unix-2.0                        GIO unix specific APIs - unix specific headers for glib I/O library
glibmm-2.4                          glibmm - C++ wrapper for GLib
libpostproc                         libpostproc - FFmpeg postprocessing library
libgsf-1                            libgsf-1 - A library for reading and writing structured files (eg MS OLE and Zip)
gobject-introspection-no-export-1.0 gobject-introspection - GObject Introspection
libtasn1                            libtasn1 - Library for ASN.1 and DER manipulation
libusb-1.0                          libusb-1.0 - C API for USB device access from Linux, Mac OS X, Windows and OpenBSD/NetBSD userspace
gio-2.0                             GIO - glib I/O library
libusb                              libusb - USB access library (libusb-1.0 compat wrapper)
libecpg_compat                      libecpg_compat - PostgreSQL libecpg_compat library
QtNetwork                           Qtnetwork - Qtnetwork Library
opencv4                              OpenCV - Open Source Computer Vision Library

Fondamentalement, le premier mot de chaque ligne de la liste ci-dessus vous indique les noms des packages que pkgconfig connaît et c'est le nom que vous devez spécifier lors de l'exécution de commandes telles que

pkg-config --cflags --libs opencv4

Si votre système est un peu foiré, vous pouvez trouver le .pc fichier que pkgconfig utilise comme ceci:

find /usr/local/Cellar -name \*.pc

ou

find /usr/local/Cellar -name \*.pc | grep -i opencv

/usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc

Et puis utilisez directement le fichier de configuration, comme ceci:

pkg-config --cflags --libs /usr/local/Cellar/opencv3/3.1.0_3/lib/pkgconfig/opencv.pc 

Si tout se compile correctement, vous pouvez l'exécuter avec

./test
38
Mark Setchell

Vous obtenez ces erreurs car vous utilisez des méthodes OpenCV dans votre code qui ne sont pas liées à votre projet.

Jusqu'à présent, vous n'avez inclus que:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

Mais pour exécuter votre code, vous avez besoin de bien plus que ces deux bibliothèques OpenCV. Par exemple, prenons l'erreur suivante lorsque vous essayez de créer votre projet dans XCODE:

Undefined symbols for architecture x86_64:
  "cv::imread(cv::String const&, int)", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ce qui correspond à cette partie de votre erreur:

...  "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
      _main in test-41a30e.o  ...

Cela se produit car XCODE cherche à exécuter la fonction suivante dans votre code:

Mat img = imread("my_image.jpg", CV_LOAD_IMAGE_UNCHANGED);

mais la façon dont vous avez implémenté cela, il ne sait pas ce qu'est imread () , car la référence à opencv bibliothèque manquante! la bibliothèque qui résout ce problème particulier est:

libopencv_imgcodecs.3.1.0.dylib

(Bien sûr, la version dépend de la version de OpenCV que vous utilisez.)

Pour résoudre cette erreur particulière, vous devez effectuer 2 étapes:

  1. Ajoutez la bibliothèque à votre projet: cliquez avec le bouton droit sur votre fichier de projet. Cliquez sur "Ajouter des fichiers à blabla" puis accédez à votre répertoire OpenCV. Les bibliothèques doivent être situées dans

/Users/YOURNAME/YOURFOLDER/opencv-3.1.0/build/lib

Mise en garde! Cela pourrait dépendre de la façon dont vous avez installé OpenCV! Si vous l'avez installé en utilisant Homebrew, le répertoire devrait être ici:

/usr/local/Cellar/opencv/2.4.9/lib

Picture: Add library to OpenCV Project.

Sélectionnez la bibliothèque suivante (libopencv_imgcodecs.3.1.0.dylib) et ajoutez-la à votre projet:

Picture: Pick the OpenCV Library

Après avoir ajouté la bibliothèque à votre projet, elle devrait apparaître dans la liste de gauche. Vérifiez que vous avez choisi la bonne bibliothèque. Certains d'entre eux ont des noms assez similaires!

  1. Inclure la bibliothèque dans votre fichier C++

Comme vous l'avez fait avec:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

Vous devriez maintenant continuer et inclure également la nouvelle bibliothèque:

#include "opencv2/imgcodecs/imgcodecs.hpp"

Picture: Include the new OpenCV Library

  1. Exécutez votre programme

Lorsque vous générez à nouveau votre programme, vous devriez avoir une erreur de moins. Et XCODE ne devrait pas avoir de problème pour exécuter cv :: imread .

Comme vous avez beaucoup d'erreurs, vous devriez maintenant continuer en vérifiant les bibliothèques dont vous avez besoin pour construire votre programme avec succès.

Je recommanderais de lier ces bibliothèques car elles sont très courantes:

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

Avant de devenir fou de toutes les erreurs, vous pouvez simplement lier toutes les bibliothèques et voir si elles se construisent correctement.

9
Kevin Katzke

Mon problème était que le brew était compilé et lié avec Xcode, et j'utilisais une version différente de g ++ de macports. Je viens d'ajouter l'emplacement Xcode g ++ à mon $PATH variable dans mon .bash_profile fichier et dissociation du mauvais binaire g ++ avec Sudo port select --set gcc none. Vous pouvez trouver l'emplacement Xcode g ++ en exécutant xcodebuild -find g++, Le mien était /Applications/Xcode.app/Contents/Developer/usr/bin/g++.

0
bmsmith