如何使用CMake部署ICU库

How do I deploy the ICU libraries using CMake?

本文关键字:ICU 部署 CMake 何使用      更新时间:2023-10-16

我正在尝试构建一个使用ICU的linux应用程序。虽然ICU库在大多数linux发行版上都是可用的,但我最近了解到它在不同版本之间通常是不兼容的。我认为最简单的方法是使用我的应用程序部署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"插件,但说明不清楚,我不确定它是否适用于这种情况。

我最终直接"找到"了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)