2017-05-20 2 views
0

Pour un certain nombre de raisons, je dois générer manuellement une bibliothèque statique à l'aide d'une commande personnalisée.CMake add_custom_command avec target_link_libraries

Cependant, il semble que la commande personnalisée n'est exécutée que lorsqu'une cible demande spécifiquement ses fichiers de sortie.

Si j'essaie de lier la bibliothèque statique générée avec target_link_libraries, CMake se plaint de ne pas trouver de règle pour la générer.

# Building library on the fly 
add_custom_command(OUTPUT mylib.a 
    COMMAND ... 
) 
add_executable(myexe main.cpp)                                      
target_link_libraries(myexe mylib.a) # Fails miserably 

J'imagine que je dois insérer une cible ou une dépendance en quelque sorte entre l'appel et la target_link_libraries un add_custom_command, mais je ne peux pas comprendre comment le faire correctement.

Répondre

0

Pour préserver la dépendance entre fichier exécutable et à la bibliothèque, vous devez utiliser chemin complet au fichier de la bibliothèque quand la liaison avec elle:

target_link_libraries(my_exe ${CMAKE_CURRENT_BINARY_DIR}/mylib.a) 

Lorsque l'on utilise un chemin relatif, CMake attend bibliothèque se trouve par le linker (selon ses règles), donc CMake ne peut pas ajuster la dépendance avec le fichier de bibliothèque dans ce cas.

+0

J'ai spécifié le chemin que vous avez dit, mais il ne fonctionne toujours pas .. – Svalorzen

+2

Hm, si CMake seule piste changer dans le fichier de bibliothèque sans se lier à 'add_custom_command'. On dirait que vous devez recourir à la cible de la bibliothèque IMPORTED, comme décrit [dans cette question] (http://stackoverflow.com/questions/31274577/custom-target-as-a-target-library-in-cmake). BTW cette question ressemble à la dupliquer pour le vôtre. – Tsyvarev

+0

Oui, il semble que c'est le même problème, ne pouvait pas le trouver avant. – Svalorzen

0

J'ai dû faire ceci pour invoquer RTW de MATLAB pour construire des DLL pour moi. La fonction que j'ai utilisée était add_custom_target.

add_custom_target(Name [ALL] [command1 [args1...]] 
        [COMMAND command2 [args2...] ...] 
        [DEPENDS depend depend depend ... ] 
        [BYPRODUCTS [files...]] 
        [WORKING_DIRECTORY dir] 
        [COMMENT comment] 
        [VERBATIM] [USES_TERMINAL] 
        [COMMAND_EXPAND_LISTS] 
        [SOURCES src1 [src2...]]) 

Pour vous, il peut ressembler à ceci:

add_custom_target(MyLib ALL 
        <Put your command here> 
        COMMENT "Building MyLib" 
       ) 
add_executable(MyExe main.cpp) 
target_link_libraries(MyExe MyLib) 

Si cela ne fonctionne pas, je l'ai entendu dire que vous pouvez utiliser add_library() pour créer une bibliothèque fictive. Ensuite, utilisez set_target_properties() pour créer une propriété INTERFACE pour cela.

Refences:

add_custom_target