Problème de liaison avec OpenCV et CMake
Je suis en train d'écrire un programme qui utilise OpenCV (installé dans un répertoire local, puisque je n'ai pas les permissions root sur la machine), et j'ai écrit le correspondant CMakeLists.txt fichier. Mon problème est que la compilation échoue à l'étape de lien de différentes façons (j'ai passé trois heures à essayer toutes les différentes solutions proposées sur le web, donc j'ai vu beaucoup de résultats).
Voici les configurations/des résultats qui font plus de sens pour moi, même si elles conduisent à un échec:
[en project_root/CMakeLists.txt]:
cmake_minimum_required(VERSION 2.8)
project(CUDA_learning)
set(OpenCV_INCLUDE_DIR "path/to/opencv_CUDA/include")
include_directories(${OpenCV_INCLUDE_DIR})
set(OpenCV_LIBS_DIR "path/to/opencv_CUDA/lib")
link_directories(${OpenCV_LIBS_DIR})
set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu")
find_package(Boost COMPONENTS system filesystem program_options regex REQUIRED)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIR})
else(Boost_FOUND)
message(FATAL_ERROR "Cannot build application without Boost. Please set Boost_INCLUDE_DIR.")
endif(Boost_FOUND)
set(CMAKE_BUILD_TYPE debug)
add_definitions("-Wall")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/../bin)
subdirs (
../src
)
[en project_root/src/CMakeLists.txt]:
FILE(GLOB dir_source *.cc 2D/*.cc)
FILE(GLOB dir_header *.hh 2D/*.hh)
add_executable(${PROJECT_NAME} ${dir_source} ${dir_header})
target_link_libraries(${PROJECT_NAME} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${OpenCV_LIBS})
Résultat:
Linking CXX executable ../../bin/CUDA_learning
c++: opencv_imgproc: No such file or directory
c++: opencv_calib3d: No such file or directory
c++: opencv_video: No such file or directory
c++: opencv_features2d: No such file or directory
c++: opencv_ml: No such file or directory
c++: opencv_highgui: No such file or directory
c++: opencv_objdetect: No such file or directory
c++: opencv_contrib: No such file or directory
c++: opencv_legacy: No such file or directory
c++: opencv_gpu: No such file or directory
Si, contrairement aux recommandations formulées sur le net, j'ai mis un "-l" avant le nom de la bibliothèque OpenCV-je obtenir:
Linking CXX executable ../../bin/CUDA_learning
/usr/bin/ld: cannot find -lopencv_core
collect2: ld returned 1 exit status
make[2]: *** [../bin/CUDA_learning] Error 1
make[1]: *** [src/CMakeFiles/CUDA_learning.dir/all] Error 2
make: *** [all] Error 2
Personne ne sait comment résoudre cette chose? Je suis littéralement de conduire un fou sur cette...
Merci beaucoup à l'avance!
Cheers,
Rob
OriginalL'auteur Rob | 2011-09-14
Vous devez vous connecter pour publier un commentaire.
Ici est la bonne façon d'inclure OpenCV dans votre projet:
Vos commentaires je vois que vous utilisez une ancienne version d'OpenCV tronc. Je vous recommande d'utiliser l'une des versions officielles ou mise à niveau vers la dernière version. Il y a plus de 200 bugs corrigés depuis 2.2.9 (y compris l'installation de plusieurs bugs).
Je sais, mais merci pour cette remarque. J'utilise une vieille version d'OpenCV parce que je n'ai pas d'accès root sur les serveurs, et alors que je suis en attente pour les admins pour installer CUDA4.0 j'ai voulu tester un peu de code...
OriginalL'auteur Andrey Kamaev
Cette ligne:
...dit que vous avez une bibliothèque dans le OpenCV_LIBS variable avec un gigantesque nom avec beaucoup d'espaces. Si vous supprimez les guillemets, comme ceci:
...alors il y aura une liste de noms de bibliothèque, et il devrait fonctionner très bien.
CMake utilise le caractère d'espace pour séparer les arguments de ses commandes. À cause de cela, inclure un espace dans une valeur dans l'ensemble de la commande, vous devez doubler le citer. Dans ce cas, vous ne voulez pas le faire parce que vous voulez que la commande set pour voir les multiples valeurs de la vous êtes de passage dans, pas une grande valeur qui contient des espaces.
EDIT: (plus d'informations sur la base de discussions dans les commentaires):
Si cela ne fonctionne toujours pas, vérifiez que les noms que vous utilisez sont correctes. Avec les noms de bibliothèque que vous utilisez ici, il devrait y avoir des fichiers nommés libopencv_core.donc, libopencv_imgproc.de la sorte, et ainsi de suite, dans le répertoire nommé par le OpenCV_LIBS_DIR variable. Si ceux-exacte des noms de bibliothèque n'existent pas en tant que fichiers, puis qui explique l'erreur de l'éditeur de liens. (Dans ce cas, tel que discuté dans les commentaires, les fichiers ont été nommés, avec les numéros de version dans le nom du fichier et il n'y avait pas de "non versionnés" liens symboliques pointant vers eux.)
Hmmmm... si vous changez de "sous-dossiers" à "add_subdirectory"?
Je l'ai changé que add_subdirectory ( ${CMAKE_BINARY_DIR}/../src ), mais toujours pas de changement dans le résultat 🙁
Je voudrais utiliser "add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src)" parce que c'est un nom de chemin complet sans ".." références relatives. Je voudrais également double vérifier la valeur de OpenCV_LIBS_DIR et assurez-vous qu'il est aussi un chemin d'accès complet de la non-référence relative au répertoire où ces bibliothèques existent. Et puis vérifiez que chacune de ces fichiers existe dans ce répertoire.
Fait, toujours pas d'amélioration. L'inscription à la liste du répertoire spécifié dans OpenCV_LIBS_DIR me donne la liste: libopencv_calib3d..2.2.9 libopencv_features2d..2.2.9 libopencv_highgui..2.2.9 libopencv_ml..2.2.9 libopencv_video..2.2.9 libopencv_contrib..2.2.9 libopencv_flann..2.2.9 libopencv_imgproc..2.2.9 libopencv_objdetect..2.2.9 pkgconfig libopencv_core..2.2.9 libopencv_gpu..2.2.9 libopencv_legacy..2.2.9 libopencv_ts..2.2.9 python2.6
OriginalL'auteur DLRdave
le problème pourrait être que l'éditeur de liens est à la recherche d'un fichier nommé
libopencv_core.so
mais il y a un fichier avec un nom similairelibopencv_core.so.1
dans ce cas, vous devez utiliser des liens symboliques. par exemple ce faireln -sf /opt/lib/libopencv_core.so.1 /opt/lib/libopencv_core.so
OriginalL'auteur Barracuda