2010-09-20 3 views
17

J'essaye de construire un projet basé sur OpenCV en utilisant CMake, fonctionnant sous Linux. Jusqu'à présent, mes CMakeLists.txt fichiers ressemble àComment dire à cmake Je veux que mon projet lie les bibliothèques statiquement?

FIND_PACKAGE (OpenCV REQUIRED) 
... 
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS}) 

, mais cela se traduit dans les bibliothèques liées dynamiquement. Comment puis-je lier avec des bibliothèques statiques?

+0

Comment pointez-vous "CMake at a static OpenCV build"? Ma construction contient des bibliothèques statiques et partagées. –

+0

voir la réponse ci-dessous: http://stackoverflow.com/a/10709424/6069 – agnul

Répondre

9

Vous construisez des bibliothèques OpenCV statiques en définissant simplement l'indicateur BUILD_SHARED_LIBS sur false dans CMake. Ensuite, tout ce que vous devez faire pour construire votre propre application avec ces bibliothèques statiques est d'ajouter une dépendance à l'égard OpenCV dans votre CMakeLists.txt:

FIND_PACKAGE (OpenCV REQUIRED) 
... 
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS}) 

et CMake prendra soin de tout.

+0

C'est 'BUILD_SHARED_LIBS', pas' _LIBRARIES'. :-) – Ela782

+0

J'ai corrigé BUILD_SHARED_LIBRARIES à BUILD_SHARED_LIBS. –

+0

Au moins avec CLion sous Windows (CLion 2016.3 EAP) fourni avec CMake 3.6.1, lors de la construction d'OpenCV 3.1.0, c'était le seul moyen de ceux listés ici qui a amené CMake à construire OpenCV en tant que bibliothèques statiques plutôt que partagées. Notez que les tentatives pour activer cette option en modifiant CMakeLists.txt ont échoué; seulement en éditant le cache CMake via la fenêtre Cache de CLion et en cliquant sur l'icône * Apply Changes and Reload Project *, j'ai pu obtenir ma combinaison CLion/CMake pour accepter BUILD_SHARED_LIBS. Vous ne savez pas si c'est un problème avec CLion qui devrait être documenté. –

8

Pour lier tout statiquement, je crois que vous cherchez CMAKE_EXE_LINKER_FLAGS (ajouter -static).

Utilisez-vous la 'méthode simple' de OpenCVConfig.cmake? ou l'ancien FindOpenCV.cmake?

1

sur la ligne add_library spécifiez static. Voir http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library

Correction puisque vous êtes à la recherche d'un lien avec une bibliothèque statique je regarderais dans la CMAKE_FIND_LIBRARY_SUFFIXES propriété

+0

Je pense que la commande add_library est de générer un binaire de sortie. Dans ce cas, la spécification de STATIC provoque l'apparition de .a. – jkerian

+0

Le mot-clé static pour add_library spécifie le type de bibliothèque qu'il génère, ce n'est pas pour lors de la génération du binaire. – RobertJMaynard

+0

Peut-être ai-je mal compris, mais je pensais que le PO essayait de se lier à une bibliothèque statique, et non de générer un. – jkerian

2

AFAIK qui est un peu difficile, parce CMake, plus précisément la commande find_library, préfère les librairies partagées et trouve les si à la fois partagé et statique sont disponibles.

Je suis toujours à la recherche d'une bonne solution moi-même pour pouvoir compiler des binaires "aussi statiques que possible", mais je n'ai pas encore trouvé de solution élégante. La seule façon dont cela fonctionnerait sûrement est de tout implémenter à travers des modules FindXXXX personnalisés.

+1

La seule façon dont je peux maintenant modifier les suffixes de la bibliothèque recherchée: 'set (CMAKE_FIND_LIBRARY_SUFFIXES $ {CMAKE_STATIC_LIBRARY_SUFFIX})' avant 'find_library()'. FindBoost et possède une option spéciale pour forcer l'utilisation de bibliothèques statiques ('Boost_USE_STATIC_LIBS'), mais il fonctionne également en interne en changeant' CMAKE_FIND_LIBRARY_SUFFIXES'. – marcin

1

Notez que gcc refuse de lier si vous passez l'option -static, mais vous avez libs dynamiques dans les arguments de lien - que vous si vous utilisez tout simplement FindOpenCV.cmake ce qui prend les libs dynamiques (I Je ne sais pas comment se comporte OpenCVConfig.cmake) ...

4

En fait, ce problème semble avoir déjà été résolu dans le OpenCVConfig.cmake fourni avec OpenCV. Tout ce que vous avez à faire est de définir OpenCV_STATIC dans votre CMakeLists.txt. C'est à dire.

set(OpenCV_STATIC ON) 
find_package(OpenCV REQUIRED) 
+0

Que fait 'find_package (OpenCV REQUIRED)'? – James

Questions connexes