2017-08-27 2 views
0

Nous avons trois cibles. L'une est une bibliothèque statique, l'autre est une bibliothèque partagée et l'autre est un programme. Nous essayons d'ajouter des indicateurs de liens spécifiques à la cible pour la bibliothèque et le programme partagés.Indicateurs de liaison manquants pour les cibles lors de l'utilisation de set_target_properties et LINK_FLAGS

Lorsque nous essayons de joindre les drapeaux dont nous avons besoin:

if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") 
    CRYPTOPP_XARCH_OPTIONS = "-xarch=ssse3 -xarch=sse4_1 ..." 
endif() 
... 

if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") 
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS APPEND "-M cryptest.mapfile") 
    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cryptest.mapfile DESTINATION ${PROJECT_BINARY_DIR}) 
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS APPEND ${CRYPTOPP_XARCH_OPTIONS}) 
endif() 

Il en résulte un échec:

CMake Error at CMakeLists.txt:631 (set_target_properties): 
set_target_properties called with incorrect number of arguments. 

Quand nous essayons d'utiliser X = ${X} Y syntaxe en raison d'un += operator manquant, alors les propriétés sont abandonnés en silence:

if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") 
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS ${LINK_FLAGS} "-M cryptest.mapfile") 
    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cryptest.mapfile DESTINATION ${PROJECT_BINARY_DIR}) 
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS ${LINK_FLAGS} ${CRYPTOPP_XARCH_OPTIONS}) 
endif() 

Par exemple, e mapfile a été perdu tester si sous Solaris sur les résultats début Xeon:

$ ./cryptest.exe v 
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_1) unsupported: 0x4800000 [ AES SSE4.1 ] 
Killed 

Voici les docs pour set_property, set_target_properties et LINK_FLAGS. Ils ne fournissent pas les détails nécessaires et ne fournissent pas d'exemples. Le doc pour set_target_properties est particulièrement charmant.

Comment ajouter des indicateurs de liaison spécifiques à la cible?

+0

Les pages de documentation pour les commandes CMake sont en fait ** détaillées **: elles contiennent des informations presque complètes pour l'utilisation correcte des commandes. La documentation de 'set_property' décrit l'option * APPEND *, et la commande l'accepte réellement. Comme ci-contre, la documentation de 'set_target_properties' ne décrit pas cette option, et la commande ne l'accepte pas. Comme vous pouvez le voir à la signature, seules les propriétés * à valeur unique * (non listées) peuvent être définies avec 'set_target_properties'. Quant au "charmant", c'est probablement à cause de * misprint *: "files" doit être lu comme "properties". – Tsyvarev

Répondre

0

Il est recommandé d'utiliser target_link_libraries() pour les indicateurs de liaison.

set(CRYPTOPP_XARCH_OPTIONS 
    -xarch=ssse3 
    -xarch=sse4_1 
    ...) 
target_link_libraries(cryptest-program 
    -M cryptest.mapfile 
    ${CRYPTOPP_XARCH_OPTIONS}) 

Notez que dans tous les cas, vous avez affaire à des listes, pas des chaînes comme vous auriez à gérer avec la propriété LINK_FLAGS. L'indentation un peu inutile ci-dessus est de souligner ce fait.