2016-05-25 59 views
0

我正在嘗試構建一個使用ICU的Linux應用程序。儘管ICU庫通常在大多數Linux發行版上可用,但我最近了解到它通常在版本之間爲not binary compatible。我認爲最簡單的方法是將ICU與我的應用程序一起部署,以便在安裝時滿足所有依賴關係。如何使用CMake部署ICU庫?

我的問題是我該如何用CMake來做到這一點?我試過如下:

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) 

這似乎工作,但是當我審視我生成的包我結束了我的應用程序期望這些庫:

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

但這些文件包括在我的包都只是與名字符號鏈接甚至不匹配:

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

有我的方式通過的cmake擺脫我的目標實際完全連接路徑,以便我可以安裝正確的文件?

有沒有不同的機制我應該用這個?我確實看到了'BundleUtilities'插件,但說明並不明確,我不確定它適用於這種情況。

回答

1

我最終直接'找到'ICU符號鏈接和實際庫文件,然後安裝它們。不是很優雅,但爲我的目的工作。不幸的是,只要我更改ICU版本,就需要進行修改。

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)