Reputation: 121
Help me please. I would like to add ICU library to my project. My cmake version is 2.8.12.2.
There is CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(test1)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
set(CMAKE_CXX_COMPILER /usr/bin/g++)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++11 -Wall")find_package(Boost 1.54.0 COMPONENTS filesystem system regex unit_test_framework REQUIRED)
find_package(ICU 52.0 REQUIRED )include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})add_executable(test1 src/dictionary.cpp src/main.cpp )
target_link_libraries( test1 ${Boost_LIBRARIES} pthread )
I have installed ICU libraries: libicu-dev, libicu-dev:i386, libicu52, libicu52:i386, libicu52-dbg:i386
But once I run CMake, I get the following error message:
CMake Error at CMakeLists.txt:10 (find_package):
By not providing "FindICU.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "ICU", but
CMake did not find one.
Could not find a package configuration file provided by "ICU" (requested
version 52.1) with any of the following names:
ICUConfig.cmake
icu-config.cmake
Add the installation prefix of "ICU" to CMAKE_PREFIX_PATH or set "ICU_DIR"
to a directory containing one of the above files. If "ICU" provides a
separate development package or SDK, be sure it has been installed.
What should I do? Help me please.
Upvotes: 9
Views: 16846
Reputation: 153
For my case with Cmake version: 3.22
I used
find_package(ICU 70.1 COMPONENTS uc REQUIRED)
..
..
target_link_libraries(
${LIBRARY_NAME}
PRIVATE
..
..
ICU::uc
..
)
which helped removing any undefined symbols.
Upvotes: 1
Reputation:
If ICU library is required, use:
find_package(ICU REQUIRED components...)
target_link_libraries(lab1 ${ICU_LIBRARIES})
If it's optional, use:
find_package(ICU COMPONENTS components...)
target_link_libraries(lab1 ${ICU_LIBRARIES})
Where components... is a list of ICU library components that can be found here.
INSERT these lines ONLY AFTER add_executable command!
Upvotes: 5
Reputation: 1581
Using CMake 3.13.
add_executable(myapp
main.cpp
)
# ICU Components Reference:
# https://cmake.org/cmake/help/latest/module/FindICU.html
# ICU components = data, i18n, io, le, lx, test, tu and uc.
find_package(ICU 61.0 COMPONENTS uc i18n REQUIRED)
# Link using the imported target names (ICU::uc, ICU::i18n, etc.)
target_link_libraries(myapp ICU::uc ICU::i18n)
Note: This wouldn't work unless I specifically listed the components in the find_package statement.
Upvotes: 12
Reputation: 121
This problem was solved by adding the file FindICU.cmake at top of the project directory from http://github.com/julp/FindICU.cmake
Upvotes: 3
Reputation: 641
It is all about including the headers and linking the libraries. For small projects, you can probably just do, (assume you already have ICU properly installed, and can be run manually)
include_directories(${ICU_INCLUDE_DIRS})
link_directories(${ICU_LIBRARY_DIRS})
add_executable(test1 src/dictionary.cpp src/main.cpp )
target_link_libraries(test1 ${ICU_LIBRARIES})
You can use below to print the info when you run "cmake" to check if cmake finds the correct path.
MESSAGE("ICU_INCLUDE_DIRS: " ${ICU_INCLUDE_DIRS})
The cmake version I am using is 3.5.2
Upvotes: 0