In certain situations you might need to generate real object files with -ipo. To force the compiler to produce real object files instead of "mock" ones with IPO, you must specify -ipo_obj in addition to -ipo.
Use of -ipo_obj is necessary under the following conditions:
An IPO compilation consists of two parts: the compile phase and the link phase. In the compile phase, the compiler produces an intermediate language (IL) version of the usersí code. In the link phase, the compiler reads the IL and completes the compilation, producing a real object file or executable.
Generally, different compiler versions produce IL based on different definitions, and therefore the ILs from different compilations can be incompatible. Intel® C++ Compiler assigns a unique version number with each compilerís IL definition. If a compiler attempts to read IL in a file with a version number other than its own, the compilation proceeds, but the IL is discarded and not used in the compilation. The compiler then issues a warning message about an incompatible IL detected and discarded.
The IL produced by the Intel compiler is stored in a file with a .il suffix. Then the .il file is placed in the library. If this library is used in an IPO compilation invoked with the same compiler as produced the IL for the library, the compiler can extract the .il file from the library and use it to optimize the program. For example, it is possible to inline functions defined in the libraries into your source code.