blob: eb63646a2f550896689296e7f50098c199646d86 [file] [log] [blame] [view] [edit]
# How To Use ICU
ICU builds and installs as relatively standard libraries. For details about
building, installing and porting see the [ICU4C
readme](/unicode-org/icu/blob/master/icu4c/readme.html) and the
[ICU4J readme](/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](/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](/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. Below are 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). It may be necessary to add
`$(prefix)/lib/pkgconfig` to the `PKG_CONFIG_PATH` variable.
If you use ICU in a **small project**, 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 like `$(CXX)`, `$(CXXFLAGS)`, `$(ICULIBS)`, `$(INVOKE)`, `$(ICUPKG)`,
`$(datadir)`, etc. By itself, `Makefile.inc` is incomplete: It assumes that it
is included into another `Makefile` which also defines `$(srcdir)`,
`$(DYNAMICCXXFLAGS)` and similar. It is probably best to copy ICU's
`autoconf`'ed top-level `./Makefile` and/or library-style `i18n/Makefile` and/or
binary-style `tools/icupkg/Makefile` and modify them as needed.
If you use ICU in a **medium-size project** where you use your own
`autoconf`/`CMake`/... setup, you will probably want to cherry-pick the
definitions you need, for example paths to ICU data and tools, rather than
taking the entire `Makefile.inc` and overriding definitions that are different
for your project. For selective ICU definitions, use the installed
`$(prefix)/bin/icu-config` script whose contents are synchronized with
`$(prefix)/lib/icu/Makefile.inc`. For example, use `\`icu-config
--invoke=icupkg\`` to invoke the ICU .dat packaging tool.
If you use ICU in a **large project**, you probably have your own build system
and will just use ICU's public header files, .so files, etc. See the next
section, "C++ With Your Own Build System"
: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 be
disabled by default in the future. As of ICU 63.1 enable or disable 63.1 with:
`--enable-icu-config` or `--disable-icu-config`
icu-config is installed (by ICU's make install) into `$(prefix)/bin/icu-config`
and can be convenient for **trivial, single-file programs** using ICU. For
example, you could compile and build a small program with `\`icu-config --cxx
--cxxflags --cppflags --ldflags\` -o sample sample.cpp`. The `icu-config` script
comes with a good `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.](http://source.icu-project.org/repos/icu/trunk/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](http://source.icu-project.org/repos/icu/trunk/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 which 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](http://bugs.icu-project.org/trac/browser/trunk/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...*`
*This feature is a work in progress, please give feedback at [Ticket
#8481](http://bugs.icu-project.org/trac/ticket/8481)*