2014-06-23 16 views
5

Dış paylaşılan kütüphane bağımlılıklarına sahip bir cmake projesi oluşturduk. CPack'i kullanarak projemizin ikili ve bağımlılıklarını paketlemek istiyoruz. Ancak hedeflerimizin bağımlılıklarını bulmaya çalışırken windows ve linux sistemlerinde farklı sonuçlar alıyoruz.cmake işlevlerinin get_prerequisites ve hedef bağımlılık yüklemesi için get_filename_component nasıl kullanılır?

CMake GetPrerequisites Modülüne (2.8.12) bir göz attık. Linux üzerinde CMake hedef (BINARY) bağımlılığının (_libFile) tam yolunu almak için aşağıdaki CMake kodunu başarıyla kullandık. Pencerelere bağımlılığın tam yolunu bul. Windows'ta, dependency_realpath değişkeni, bağımlılığın doğru yolu olmayan $ {CMAKE_SOURCE_DIR}/DEPENDENCY_FILE gibi bir şeye sahiptir.

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) 

Yani soru olacaktır: Neden windows ve linux üzerinde bağımlılık yerler için farklı sonuçlar alıyoruz?

+0

Gerçekte hangi sonuçları alıyorsunuz? Ne sonuçları bekliyorsunuz? Döngünün çıktısını görmek istiyorum "foreach (d $ {DEPENDENCIES}) mesajı (" d = '$ {d}' ") endforeach()" REALPATH yapmaya gerek yok, get_prerequisites'in sonuçları Zaten dolu yollar olsun ... – DLRdave

+0

Hedeflerimden birinin sonucunu yazdırdım. Bu liste sadece dosya değil, tam yolları içeriyor görünüyor: 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 = gp_cmd olan 'vtkRendering.dll' – tisch

+0

bu dumpbin ilişkili olabilir,? – tisch

cevap

9

get_prerequisites'in döndürdüğü başvurular mutlak tam yol başvuruları değildir ve aynı zamanda basit bir get_filename_component çağrısı yoluyla mutlak referansları çözemezler. (Mac'te, bunlar @executable_path içerebilir, örneğin.)

Ancak, burada yardımcı olabilecek gp_resolve_item adlı GetPrerequisites.cmake modülünde başka bir işlev vardır.

bu deneyin: bunlar PATH olduğunu varsayarak, DLL tam yol konumlara DLL adlarını dönüştürmek gerekir

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

. Başka dizinlerde bulunuyorlarsa, bunları get_prerequisites ve gp_resolve_item için "dirs" argümanları olarak sağlamanız gerekebilir.

GetPrerequisites.cmake modülü için dokümanları buradadır: Ayrıca http://www.cmake.org/cmake/help/v3.0/module/GetPrerequisites.html

, büyük olasılıkla, GetPrerequisites nasıl kullandığını görmek için BundleUtilities.cmake modüle kazmak.