2014-06-23 6 views
5

Abbiamo impostato un progetto cmake con dipendenze esterne della libreria condivisa. Vogliamo impacchettare i binari e le dipendenze del nostro progetto usando CPack. Tuttavia stiamo ottenendo risultati diversi su Windows e Linux quando proviamo a trovare dipendenze dai nostri obiettivi.come utilizzare le funzioni cmake get_prerequisites e get_filename_component per l'installazione della dipendenza target?

Abbiamo dato un'occhiata al modulo GetPrerequisites di CMake (2.8.12). Abbiamo utilizzato con successo il seguente codice CMake per ottenere il percorso completo di una dipendenza target (BINARY) di CMake (_libFile) su linux, tuttavia non ottenere il percorso completo della dipendenza da Windows. Su Windows la variabile dependency_realpath contiene qualcosa come $ {CMAKE_SOURCE_DIR}/DEPENDENCY_FILE, che non è il percorso corretto per la dipendenza.

string(TOUPPER "${CMAKE_BUILD_TYPE}" CONFIG) 
GET_TARGET_PROPERTY(MY_BINARY_LOCATION ${BINARY} LOCATION_${CONFIG}) 
GET_PREREQUISITES(${MY_BINARY_LOCATION} DEPENDENCIES 0 0 "" "") 

foreach(DEPENDENCY_FILE ${DEPENDENCIES}) 
    get_filename_component(dependency_realpath ${DEPENDENCY_FILE} REALPATH) 

Quindi la domanda sarebbe: Perché stiamo ottenendo risultati diversi per le posizioni di dipendenza su Windows e Linux?

+0

Quali risultati ottieni? Quali risultati ti aspetti? Mi piacerebbe vedere l'output del messaggio "foreach (d $ {DEPENDENCIES}) (" d = '$ {d}' ") endforeach()" Non ci dovrebbe essere bisogno di REALPATH, i risultati di get_prerequisites dovrebbero già percorsi completi ... – DLRdave

+0

Ho stampato il risultato di uno dei miei obiettivi. Sembra che l'elenco contiene solo i nomi dei file, non i percorsi completi: D = 'ITKCommon-4.4.dll' d = 'KERNEL32.dll' d = 'MSVCP100.dll' d = 'MSVCR100.dll' d = 'rpcrt4.dll' d = 'VCOMP100.DLL' d = 'liblinear.dll' d = 'libsvm.dll' d = 'vtkCommon.dll' d = 'vtkFiltering.dll' d = 'vtkGraphics.dll' d = 'vtkHybrid.dll' d = 'vtkIO.dll' d = 'vtkImaging.dll' d = 'vtkRendering.dll' – tisch

+0

questo potrebbe essere correlato a DUMPBIN, che è il gp_cmd? – tisch

risposta

9

I riferimenti che i ritorni get_prerequisites non sono riferimenti assoluti al percorso completo e inoltre non sono risolvibili con riferimenti assoluti tramite una semplice chiamata get_filename_component. (Su Mac, possono contenere @executable_path, per esempio.)

Tuttavia, c'è un'altra funzione nel modulo GetPrerequisites.cmake chiamato gp_resolve_item che può aiutarti qui.

Prova questo:

get_prerequisites(${MY_BINARY_LOCATION} DEPENDENCIES 0 0 "" "") 

foreach(DEPENDENCY_FILE ${DEPENDENCIES}) 
    gp_resolve_item("${MY_BINARY_LOCATION}" "${DEPENDENCY_FILE}" "" "" resolved_file) 
    message("resolved_file='${resolved_file}'") 
endforeach() 

Questo dovrebbe convertire i nomi DLL nelle posizioni di percorso completo delle DLL, ammesso che siano nel PATH. Se si trovano in altre directory, potrebbe essere necessario fornire quelle come argomenti "dirs" per get_prerequisites e gp_resolve_item.

La documentazione per il modulo GetPrerequisites.cmake è qui: http://www.cmake.org/cmake/help/v3.0/module/GetPrerequisites.html

Inoltre, forse scavare nel modulo BundleUtilities.cmake per vedere come si usa GetPrerequisites.

Problemi correlati