Julia
Julia

Reputation: 121

How to add ICU library to project?

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

Answers (5)

Arnab Das
Arnab Das

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

user11929915
user11929915

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

Mercury Dime
Mercury Dime

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

Julia
Julia

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

Ken H
Ken H

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

Related Questions