2016-05-25 17 views
0

Ich versuche, eine Linux-Anwendung zu erstellen, die ICU verwendet. Während die ICU-Bibliothek allgemein auf den meisten Linux-Distributionen verfügbar ist, habe ich kürzlich festgestellt, dass es zwischen den Versionen im Allgemeinen not binary compatible ist. Ich denke, der einfachste Weg wird die Bereitstellung der Intensivstation mit meiner Anwendung sein, so dass alle Abhängigkeiten bei der Installation erfüllt sind.Wie stelle ich die ICU-Bibliotheken mit CMake bereit?

Meine Frage ist, wie kann ich das mit CMake tun? Ich habe versucht, die folgenden:

find_library(ICUIL18N_LIB icui18n) 
find_library(ICUUC_LIB icuuc) 
find_library(ICUDATA_LIB icudata) 

#link pthread and ICU against the library 
target_link_libraries(MyApp pthread rt ${ICUIL18N_LIB} ${ICUUC_LIB}) 

install(FILES ${ICUIL18N_LIB} ${ICUUC_LIB} ${ICUDATA_LIB} 
     DESTINATION lib) 

Dies jedoch scheint zu funktionieren, wenn ich meine erzeugte Paket untersuchen ich am Ende mit meiner Anwendung Bibliotheken erwarten:

libicui18n.so.50 => /lib/libicui18n.so.50 (0xf74ee000) 
libicuuc.so.50 => /lib/libicuuc.so.50 (0xf737b000) 

Aber die Dateien, die in meine Pakete sind nur für mich

/lib/libicui18n.so -> libicui18n.so.50.1.2 
/lib/libicuuc.so -> libicuuc.so.50.1.2 
/lib/libicudata.so -> libicudata.so.50.1.2 

gibt es einen Weg, um die tatsächlichen vollvernetzte Pfade von meinem Ziel über Cmake so dass ich die richtigen Dateien installieren: Symlinks mit Namen, die nicht einmal passen?

Gibt es einen anderen Mechanismus, den ich dafür verwenden sollte? Ich habe das Plugin 'BundleUtilities' gesehen, aber die Anweisungen sind nicht klar und ich bin mir nicht sicher, ob es auf diese Situation anwendbar ist.

Antwort

1

Ich landete direkt "finden" die ICU Symlinks und tatsächliche Bibliotheksdateien, dann installieren sie. Nicht sehr elegant, aber funktionierte für meine Zwecke. Leider erfordert dies eine Änderung, wenn ich ICU-Versionen ändere.

set(ICU_MAJOR_VER "57") 
set(ICU_FULL_VERSION "${ICU_MAJOR_VER}.1") 


find_library(ICUIL18N_LIB libicui18n.so.${ICU_FULL_VERSION} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH) 
find_library(ICUUC_LIB libicuuc.so.${ICU_FULL_VERSION} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH) 
find_library(ICUDATA_LIB libicudata.so.${ICU_FULL_VERSION} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH) 

find_library(ICUIL18N_MAJOR_LIB libicui18n.so.${ICU_MAJOR_VER} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH) 
find_library(ICUUC_MAJOR_LIB libicuuc.so.${ICU_MAJOR_VER} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH) 
find_library(ICUDATA_MAJOR_LIB libicudata.so.${ICU_MAJOR_VER} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/ NO_DEFAULT_PATH) 

install(FILES ${ICUIL18N_LIB} ${ICUUC_LIB} ${ICUDATA_LIB} 
       ${ICUIL18N_MAJOR_LIB} ${ICUUC_MAJOR_LIB} ${ICUDATA_MAJOR_LIB} 
     DESTINATION lib)