如何使用CMake部署ICU库?

时间:2016-05-25 14:52:30

标签: c++ linux cmake icu

我正在尝试构建一个使用ICU的Linux应用程序。虽然ICU库通常可以在大多数Linux发行版上使用,但我最近了解到版本之间通常是not binary compatible。我认为最简单的方法是使用我的应用程序部署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 个答案:

答案 0 :(得分: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)