2017-09-04 1 views
1

J'ai une variable:CMake - Crée une liste de chemins absolus.

set(${PROJECT_NAME}_EXTERNAL_LIBRARIES 
     ${PocoNetExternal_LIBRARIES} 
) 

qui vient de:

set(EXTERNAL_NAME PocoNetExternal) 
    set(${EXTERNAL_NAME}_LIBRARIES 
     ${PROJECT_BINARY_DIR}/${EXTERNAL_NAME}/Foundation/${CMAKE_SHARED_LIBRARY_PREFIX}PocoFoundation${POCO_build_postfix}${CMAKE_STATIC_LIBRARY_SUFFIX} 
     ${PROJECT_BINARY_DIR}/${EXTERNAL_NAME}/Util/${CMAKE_SHARED_LIBRARY_PREFIX}PocoUtil${POCO_build_postfix}${CMAKE_STATIC_LIBRARY_SUFFIX} 
     ${PROJECT_BINARY_DIR}/${EXTERNAL_NAME}/Net/${CMAKE_SHARED_LIBRARY_PREFIX}PocoNet${POCO_build_postfix}${CMAKE_STATIC_LIBRARY_SUFFIX} 
     ) 

En raison de la question examinée dans This Question, je besoin de tous ces chemins sont relatifs.

J'ai essayé:

function(makeLibPathsAbsolute) 

    set(temp ${${PROJECT_NAME}_EXTERNAL_LIBRARIES}) #rename list 
    set(external_libraries_rel)      #make empty list 

    list(LENGTH temp len1)     #len1 is length of temp list 
    math(EXPR len2 "${len1} - 1")   #len2 is len1 - 1 

    foreach(val RANGE ${len2})         #for val = 0 to len2 
     list(GET temp ${val} relPath)       #relPath becomes the {val} entry of temp 
     get_filename_component(absPath ${relPath} ABSOLUTE) #make relPath Absolute and call it absPath 
     list(APPEND external_libraries_rel ${absPath})  #Append this to the external_libraries_rel list 
    endforeach() 

endfunction() 

Mais quand je l'utilise target_link_libraries(${name} ${external_libraries_rel})-je obtenir une Undefined erreur de référence pour toutes les fonctions liées à la bibliothèque, je suis en train de créer un lien. Indique que la bibliothèque n'a pas été réellement liée.

Est-ce ma fonction makeLibPathsAbsolute() correcte?

+0

Vous ne semblez pas retourner quoi que ce soit de votre fonction. Pouvez-vous vérifier que la variable passée à 'target_link_libraries' n'est pas vide? – arrowd

Répondre

2

Par défaut, toutes les variables définies dans la fonction ne sont pas visibles à l'extérieur. (En d'autres termes, la définition de la variable est SCOPED à la fonction). Pour rendre la variable visible pour l'appelant de la fonction, utilisez l'option PARENT_SCOPE de la commande set().

E.g. vous pouvez « publier » external_libraries_rel liste en ajoutant cette ligne à la fin de la fonction:

set(external_libraries_rel ${external_libraries_rel} PARENT_SCOPE) 
+0

Hum, maintenant je relise docs et vous êtes tout à fait raison. – arrowd

+0

@arrowd: Pourquoi avez-vous supprimé votre propre réponse? À l'exception de l'option manquée (je pensais que c'était involontaire), cela montre bien comment ** déclarer ** et implémenter des fonctions qui devraient retourner quelque chose. – Tsyvarev

+1

Le point principal dans mon message était omettre 'PARENT_SCOPE', mais il s'est avéré que c'est impossible. En ce qui concerne le retour de la fonction en utilisant des arguments de retour - je ne pense pas que cela mérite une réponse séparée. Ajoutez-le simplement à votre message, si vous le souhaitez. – arrowd