7

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.

YakovL
  • 7,557
  • 12
  • 62
  • 102
Julia
  • 101
  • 1
  • 1
  • 7

4 Answers4

8

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.

Mercury Dime
  • 1,141
  • 2
  • 10
  • 10
  • "Note: This wouldn't work unless I specifically listed the components in the find_package statement." You, sir, are a life-saver! – MikeMB Dec 04 '19 at 11:00
4

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!

3

This problem was solved by adding the file FindICU.cmake at top of the project directory from http://github.com/julp/FindICU.cmake

RamblingMad
  • 5,332
  • 2
  • 24
  • 48
Julia
  • 101
  • 1
  • 1
  • 7
  • Since version 3.7.0, [CMake comes with a packaged `FindICU.cmake`](https://cmake.org/cmake/help/v3.7/module/FindICU.html#module:FindICU), which however works differently to the one by julp (i.e. is incompatible). – DevSolar Jan 10 '17 at 14:00
  • 1
    @DevSolar, on my macbook with homebrew installed icu4c, it's not working. – linrongbin Jun 13 '19 at 08:23
  • 1
    @linrongbin This comment is hardly the place to debug the issue; perhaps ask a separate question? – DevSolar Jun 13 '19 at 08:31
0

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

Ken H
  • 601
  • 8
  • 6