blob: 7539369de8e55d3cad8f3bb074e20fa6b9976ad5 [file] [log] [blame] [view]
---
layout: default
title: How To Use ICU
nav_order: 2
parent: ICU
---
<!--
© 2020 and later: Unicode, Inc. and others.
License & terms of use: http://www.unicode.org/copyright.html
-->
# How To Use ICU
{: .no_toc }
## Contents
{: .no_toc .text-delta }
1. TOC
{:toc}
---
# Overview
ICU builds and installs as relatively standard libraries. For details about
building, installing and porting see the [ICU4C
readme](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/master/icu4c/readme.html) and the
[ICU4J readme](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/master/icu4j/readme.html).
In addition, ICU4C installs several scripts and makefile fragments that help
build other code using ICU.
For C++, note that there are [Recommended Build
Options](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/master/icu4c/readme.html#RecBuild)
(both for normal use and for ICU as system-level libraries) which are not
default simply for compatibility with older ICU-using code.
Starting with ICU 49, the ICU4C readme has a short section about
[User-Configurable
Settings](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/master/icu4c/readme.html#UserConfig).
## C++ Makefiles
The recommended way to use ICU in Makefiles is to use the
[pkg-config](http://pkg-config.freedesktop.org/) files which are installed by
ICU upon "`make install`". There are files for various libraries and components.
This is preferred over the deprecated icu-config script.
This table shows the package names used within pkg-config.
|**Package**|**Contents**|
|------|--------------------|
|icu-uc|Common (uc) and Data (dt/data) libraries|
|icu-i18n|Internationalization (in/i18n) library|icu-le [Layout Engine](layoutengine/index.md)|
|icu-lx|Paragraph Layout|
|icu-io|[Ustdio](io/ustdio.md)/[iostream](io/ustream.md) library (icuio)
For example, to compile a simple application, you could run the following
command. See the [pkg-config](http://pkg-config.freedesktop.org/) manpage for
more details.
c++ -o test test.c `pkg-config --libs --cflags icu-uc icu-io`
ICU installs the pkg-config (.pc) files in `$(prefix)/lib/pkgconfig` (where
`$(prefix)` is the installation prefix for ICU). Note that you may need to add
`$(prefix)/lib/pkgconfig` to the `PKG_CONFIG_PATH` variable.
### ICU in a small project
For small projects, it may be convenient to take advantage of
ICU's `autoconf`'ed files. ICU `make install` writes
`$(prefix)/lib/icu/Makefile.inc` which defines most of the necessary *make*
variables such as `$(CXX)`, `$(CXXFLAGS)`, `$(ICULIBS)`, `$(INVOKE)`, `$(ICUPKG)`,
`$(datadir)`, etc.
By itself, `Makefile.inc` is incomplete. It assumes that it will be included into another
`Makefile` which will define `$(srcdir)`, `$(DYNAMICCXXFLAGS)` and similar values.
In this case, it is probably best to copy ICU's
`autoconf`'ed top-level `./Makefile` and/or library-target-style `i18n/Makefile` and/or
binary-target-style `tools/icupkg/Makefile`. Then modify them as needed.
### ICU in a medium-sized project
If you use your own `autoconf`/`CMake`/... setup, consider cherry-picking only the
definitions needed, for example paths to specific ICU data and tools.
This is often preferable to taking the entire `Makefile.inc` and
overriding (many) definitions that are different.
For selective ICU definitions, use the installed
`$(prefix)/bin/icu-config` script.
Its contents are synchronized with `$(prefix)/lib/icu/Makefile.inc`.
For example, use `icu-config --invoke=icupkg` to invoke the ICU .dat packaging tool.
### ICU in a large project
In this case, you probably have your own build system. Just use ICU's public header
files, `.so` files, etc. See the next section, "C++ With Your Own Build System".
## Notes on `icu-config`
> :point_right: **Note**: **icu-config is deprecated, and no longer recommended for
> production use. Please use pkg-config files or other options.**
As of ICU 63.1, [icu-config has been deprecated
(ICU-10464)](https://unicode-org.atlassian.net/browse/ICU-10464).
`icu-config` may be disabled by default in the future.
As of ICU 63.1, you may enable or disable 63.1 with a configure flag:
`--enable-icu-config` or `--disable-icu-config`
`icu-config` is installed (by ICU's `make install`) into `$(prefix)/bin/icu-config`.
It can be convenient for **trivial, single-file programs** that use ICU. For
example, you could compile and build a small program with this command line:
icu-config --cxx --cxxflags --cppflags --ldflags -o sample sample.cpp
Detailed usage of `icu-config` script is described in its `man` page.
## C++ With Your Own Build System
If you are not using the standard build system, you will need to construct your
own system. Here are a couple of starting points:
* At least for initial bring-up, use pre-built data files from the ICU
download or from a normally-built ICU. Copy the icudt***XXx*.dat file from
`icu/source/data/in/` or `icu/source/data/out/tmp/` in either of these two
locations, into `icu/source/data/in/`** on your target ICU system. That way,
you won't need to build ICU's data-generation tools.
* Don't compile all files. Look in the `Makefile.in` files for `OBJECTS=`
clauses which will indicate which source files should be compiled. (Some .c
files are #included into others and cannot be compiled by themselves.)
* ICU does not throw or handle exceptions. Consider turning them off via g++'s
`-fno-exceptions` or equivalent.
* Each ICU library needs to be compiled with -DU_COMMON_IMPLEMENTATION,
-DU_I18N_IMPLEMENTATION etc. as appropriate. See unicode/utypes.h for the
set of such macros. If you build one single DLL (shared library) for all of
ICU, also use -DU_COMBINED_IMPLEMENTATION. If you build ICU as
statically-linked libraries, use -DU_STATIC_IMPLEMENTATION.
* Use the [icu-support mailing list](http://site.icu-project.org/contacts).
Ask for help and guidance on your strategy.
* Up until ICU 4.8, there are one or two header files (platform.h, icucfg.h)
that are generated by autoconf/configure and thus differ by platform,
sometimes even by target settings on a single platform (e.g., AIX 32-bit vs.
64-bit, Mac OS X universal binaries PowerPC vs. x86). If you do not use
autoconf, you probably need to configure-generate these header files for
your target platforms and select among them, or merge the generated headers
if they are similar, or simulate their generation by other means.
* Starting with ICU 49, all source code files are fixed (not generated). In
particular, there is one single platform.h file which determines
platform-specific settings via `#if ...`
## C++ Namespace
ICU C++ APIs are normally defined in a versioned namespace, for example
"icu_50". There is a stable "icu" alias which should be used instead. (Entry
point versioning is only to allow for multiple ICU versions linked into one
program. [It is optional and should be off for system
libraries.](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/master/icu4c/readme.html#RecBuild))
By default, and only for backward compatibility, the ICU headers contain a line
`using namespace icu_50;` which makes all ICU APIs visible in/with the global
namespace (and potentially collide with non-ICU APIs there). One of the
[Recommended Build
Options](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/master/icu4c/readme.html#RecBuild)
is to turn this off.
To write forward declarations, use
U_NAMESPACE_BEGIN
class UnicodeSet;
class UnicodeString;
U_NAMESPACE_END
To qualify an ICU class name, use the "icu" alias:
static myFunction(const icu::UnicodeString &s) {...}
Frequently used ICU classes can be made easier to use in .cpp files with
using icu::UnicodeSet;
using icu::UnicodeString;
## Other Notes
### Helper Install Utilities
ICU installs `$(prefix)/share/icu/$(VERSION)/install-sh` and
`$(prefix)/share/icu/$(VERSION)/mkinstalldirs`. These may be used by ICU tools and
samples. Their paths are given in the installed `Makefile.inc` (see above).
### Data Packaging Settings
The `pkgdata` tool (see [Packaging ICU4C](packaging/index.md) ) makes use of the
installed file `**$(prefix)/lib/icu/pkgdata.inc**` to set parameters for data
packaging operations that require use of platform compilers and linkers ( in
`static` or `dll` mode). `pkgdata` uses the icu-config script in order to locate
**pkgdata.inc**. If you are not building ICU using the supplied tools, you may
need to modify this file directly to allow `static` and `dll` modes to function.
### Building and Running Trivial C/C++ Programs with `icurun`
For building and running trivial (one-compilation-unit) programs with an
installed ICU4C, the shell script
[icurun](https://github.com/unicode-org/icu/blob/master/tools/scripts/icurun)
may be used. For detailed help, see the top of that script.
As an example, if ICU is installed to the prefix **/opt/local** and the current
directory contains two sample programs "test1.cpp" and "test2.c", they may be
compiled and run with any of the following commands. The "-i" option specifies
either the installed icu-config script, or the directory containing that script,
or the path to a 'bin' directory.
* `icurun **-i /opt/local** test1.cpp`
* `icurun **-i /opt/local/bin** test2.c`
* `icurun **-i /opt/local/bin/icu-config** test1.cpp`
If "icu-config" is on the PATH, the -i option may be omitted:
* `icurun test1.cpp`
Any additional arguments will be passed to the program.
* `icurun test1.cpp *args...*`
*Please give feedback to the [icu-support mailing list](http://site.icu-project.org/contacts),
and refer to [Ticket #8481](https://unicode-org.atlassian.net/browse/ICU-8481).*