2014-06-23 4 views
5

Przygotowaliśmy projekt cmake z zewnętrznymi zależnościami bibliotek współdzielonych. Chcemy spakować pliki binarne i zależności naszego projektu za pomocą CPack. Jednak przy próbie znalezienia zależności od naszych celów uzyskujemy różne wyniki w systemach Windows i Linux.Jak korzystać z funkcji cmake get_prerecenzje i get_filename_component dla instalacji zależności docelowej?

Przejrzeliśmy moduł GetPrerequisites CMake (2.8.12). Pomyślnie użyliśmy następującego kodu CMake, aby uzyskać pełną ścieżkę zależności CMake target (BINARY) (_libFile) na Linuksie, jednak nie nie dostanie pełnej ścieżki zależności w oknach. W systemie Windows zmienna dependency_realpath zawiera coś w rodzaju $ {CMAKE_SOURCE_DIR}/DEPENDENCY_FILE, która nie jest poprawną ścieżką do zależności.

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) 

Pytanie brzmiało: Dlaczego otrzymujemy różne wyniki dla lokalizacji zależności w systemie Windows i systemie Linux?

+0

Jakie wyniki uzyskujesz? Jakich wyników oczekujesz? Chciałbym zobaczyć wyjście pętli "foreach (d $ {DEPENDENCIES}) message (" d = '$ {d}' ") endforeach()" Nie powinno być potrzeby wykonywania REALPATH, wyniki get_prerecenzites powinny już są pełne ścieżki ... – DLRdave

+0

Wydrukowałem wynik jednego z moich celów. Wydaje się, że lista zawiera tylko nazwy plików, a nie pełne ścieżki: 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

Czy może to być związane z DUMPBIN, który jest gp_cmd? – tisch

Odpowiedz

9

Odwołania, do których zwracane są instrukcje get_prerequisites, nie są bezwzględnymi pełnymi referencjami do ścieżek, a ponadto nie można ich rozstrzygnąć w odniesieniu do odwołań bezwzględnych za pomocą prostego wywołania get_filename_component. (Na Macu mogą one na przykład zawierać @executable_path).

Istnieje jednak inna funkcja w module GetPrerequisites.cmake o nazwie gp_resolve_item, która może Ci w tym pomóc.

Spróbuj tego:

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() 

To powinno przekształcić nazwy DLL do pełnych miejscach ścieżka DLL, zakładając, że są one w PATH. Jeśli są w innych katalogach, może być konieczne podanie ich jako argumentów "dirs" dla get_prerequisites i gp_resolve_item.

Dokumentacja modułu GetPrerequisites.cmake jest tutaj: http://www.cmake.org/cmake/help/v3.0/module/GetPrerequisites.html

Również ewentualnie kopać w module BundleUtilities.cmake zobaczyć jak to wykorzystuje GetPrerequisites.