2017-03-20 3 views
0

Je souhaite que CMake trouve trois bibliothèques statiques dans le même dossier. Ceci est la partie de mon CMakeLists.txt je me bats avec:La bibliothèque find_library de CMake() ne localise pas les bibliothèques.

# Dependencies' directories 
set(OGRE3D_DIR "D:/Data/Libs/ogre3D-1.10") 

# Required libraries 
find_library(OGREMAIN_LIB 
     NAMES OgreMain OgreMain_d 
     HINTS "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}") 

find_library(OGREOVERLAY_LIB 
     NAMES OgreOverlay OgreOverlay_d 
     HINTS "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}") 

find_library(OIS_LIB 
     NAMES OIS OIS_d 
     HINTS "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}") 

# Target 
add_executable(Test Main.cpp) 

# Library linking 
target_link_libraries(Test 
     ${OGREMAIN_LIB} 
     ${OGREOVERLAY_LIB} 
     ${OIS_LIB}) 

Pour une raison quelconque, sont tous à NOTFOUND, mais les trois variables OGREMAIN_LIB, OGREOVERLAY_LIB et OIS_LIB si j'essaie de les imprimer je trouve qu'ils est réglé sur le chemin attendu (même celui qui est correct entre le suffixe et le non-suffixe est choisi). Toutes les bibliothèques sont évidemment dans le chemin prévu.

Qu'est-ce que je fais mal ici?

+0

Les résultats des appels 'find_library()' sont mis en cache, mais ils devraient essayer de les retrouver s'ils ne sont pas trouvés. Donc, lors de vos tests, avez-vous toujours démarré à partir d'un répertoire de sortie binaire vide? Pendant la configuration de votre projet - tout en testant votre 'CMakeLists.txt' - je recommanderais d'ajouter par exemple. 'unset (OGREMAIN_LIB CACHE)' avant les appels 'find_library()' pour forcer CMake à rechercher la bibliothèque à chaque fois. – Florian

+0

'... les trois variables OGREMAIN_LIB, OGREOVERLAY_LIB et OIS_LIB sont toutes définies sur NOTFOUND, mais si j'essaie de les imprimer, je trouve qu'elles sont définies ...' - Donc, sont ces variables '-NOTFOUND' ou définies sur chemin? Comment les vérifiez-vous (via 'message()', dans le cache CMake, etc.)? – Tsyvarev

+0

Pour ce qui concerne l'effacement du cache, je le fais via l'interface de CLion juste avant de recharger le projet (qui appelle CMake), mais ils finissent par -NOTFOUND dans le cache de CMake (également inspecté via l'interface graphique de CLion). Quant à l'impression de leurs noms, j'utilise le chemin message (STATUS): $ {OGREMAIN_LIB} ")' (etc.) après la dernière instruction 'find_library()', et le chemin attendu est imprimé. – pr0gma

Répondre

0

Je n'ai pas pu reproduire votre problème. L'appel find_library() a correctement mis en cache ses résultats.

Prenant votre exemple et en ajoutant quelques espaces réservés vides pour effectuer un test, je dirais que cela fonctionne très bien:

cmake_minimum_required(VERSION 2.6) 

# Dependencies' directories 
set(OGRE3D_DIR "ogre3D-1.10") 
set(OGRE3D_LIB_DIR "${OGRE3D_DIR}/lib/${CMAKE_BUILD_TYPE}") 

file(WRITE "${OGRE3D_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OgreMain${CMAKE_STATIC_LIBRARY_SUFFIX}" "") 
file(WRITE "${OGRE3D_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OgreOverlay${CMAKE_STATIC_LIBRARY_SUFFIX}" "") 
file(WRITE "${OGRE3D_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OIS${CMAKE_STATIC_LIBRARY_SUFFIX}" "") 

# Required libraries 
find_library(OGREMAIN_LIB 
     NAMES OgreMain OgreMain_d 
     HINTS "${OGRE3D_LIB_DIR}") 

find_library(OGREOVERLAY_LIB 
     NAMES OgreOverlay OgreOverlay_d 
     HINTS "${OGRE3D_LIB_DIR}") 

find_library(OIS_LIB 
     NAMES OIS OIS_d 
     HINTS "${OGRE3D_LIB_DIR}") 

foreach(_var IN ITEMS OGREMAIN_LIB OGREOVERLAY_LIB OIS_LIB) 
    get_property(_var_cached CACHE ${_var} PROPERTY VALUE) 
    message(STATUS "CACHED path: ${_var_cached}") 
    message(STATUS "path: ${${_var}}") 
endforeach() 

# Target 
file(WRITE main.cpp "int main() { return 0; }") 
add_executable(Test Main.cpp) 

# Library linking 
target_link_libraries(Test 
     ${OGREMAIN_LIB} 
     ${OGREOVERLAY_LIB} 
     ${OIS_LIB}) 

Pourriez-vous donner mon exemple minimal essayer? Je suppose que votre problème devrait faire quelque chose avec votre environnement.