| --- | 
 | 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).* |