# Managing Libraries

## Managing Libraries on Linux*

During compilation, the compiler reads the `LIBRARY_PATH` environment variable for static libraries it needs to link when building the executable. At runtime, the executable will link against dynamic libraries referenced in the `LD_LIBRARY_PATH` environment variable.

## Modifying LIBRARY_PATH

If you want to add a directory, /libs for example, to the `LIBRARY_PATH`, you can do either of the following:

- Command line: `prompt> export LIBRARY_PATH=/libs:$LIBRARY_PATH`

- Startup file: `export LIBRARY_PATH=/libs:$LIBRARY_PATH`

To compile file.cpp and link it with the library mylib.a, enter the following command:

    //on Linux
    [invocation] file.cpp mylib.a

With [invocation] being `icpx` or `dpcpp`.

The compiler passes file names to the linker in the following order:

1. To the object file.

2. To any objects or libraries specified at the command line, in a response file, or in a configuration file.

3. To the Intel® Math Library, libimf.a.

By default, the Intel® oneAPI DPC++/C++ Compiler uses the GNU* implementation of the C++ Standard Library (libstdc++) on OS* X v10.8, and libc++ implementation on OS* X v10.9. You can change the default using the -stdlib option:

    -stdlib=libc++	//to switch to libc++
    -stdlib=libstdc++	//to switch to libstdc++

## Compile with DPC++ and Link Other Compilers

When you use the `dpcpp` compiler and source its entire environment, then linking works correctly with other compilers if the correct path to the compiler libraries is set. This allows programs to be compiled with DPC++ and then linked with other compilers (example: `gcc`). If you try to do this without sourcing the compiler environment, the linking fails with undefined references in `libsycl.so` and other internal libraries.

To resolve this, add the following paths to `LD_LIBRARY_PATH`:

    <install_dir>/compiler/latest/linux/compiler/lib/intel64

    <install_dir>/compiler/latest/linux/lib

    <install_dir>/compiler/latest/linux/lib/x64

    <install_dir>/tbb/latest/lib/intel64/gcc4.8

## Managing Libraries on Windows*

The `LIB` environment variable contains a semicolon-separated list of directories in which the Microsoft* linker will search for library (.lib) files. The compiler does not specify library names to the linker, but includes directives in the object file to specify the libraries to be linked with each object.

For more information on adding library names to the response file and the configuration file, see Using Response Files and Using Configuration Files.

To specify a library name on the command line, you must first add the library's path to the `LIB` environment variable. Then, to compile file.cpp and link it with the library mylib.lib, enter the following command:

    [invocation] file.cpp mylib.lib

Where[`invocation`] is `icx` for C++ or `dpcpp-cl`for DPC++.

## Other Considerations

The Intel Compiler Math Libraries contain performance-optimized implementations for various Intel platforms. By default, the best implementation for the underlying hardware is selected at runtime. The library dispatch of multi-threaded code may lead to apparent data races, which may be detected by certain software analysis tools. However, as long as the threads are running on cores with the same CPUID, these data races are harmless and are not a cause for concern.

Parent topic: Libraries