Are Intel Compiler-generated objects/binaries backward and/or forward compatible between versions?

In general, objects generated by different major versions of the Intel compiler are compatible with each other, with three main exceptions:

  1. Objects built with interprocedural optimization (/Qipo or -ipo). All such objects should be built with the same compiler version and subversion. Example:
    (with 14.0) icpc -ipo -c -o a-14.o a.cpp
    (with 15.0) icpc -ipo -c -o b-15.o b.cpp
    (with 15.0) icpc –ipo a-14.o b-15.o
    "ipo: error #11034: il version for a-14.o (265739) does not match compiler's il version (258839), please regenerate”​
  2. Objects built to be compatible with one underlying ABI version may not be compatible with objects built to be compatible with a different ABI version. Such ABI versions correspond to the options /Qvc (Windows*) or -gcc-name and -gxx-name (Linux*). The default ABI may be different on different host systems. This more typically results in linker errors, but there is the possibility of runtime errors as well.
  3. Objects built with a recent compiler version may not be compatible with the run-time libraries of an older compiler version. Such objects may call APIs not supported by the older compiler version. When mixing objects from multiple compiler versions, use the most recent compiler version and run-time to link. Example:
    (with 14.0) icpc -c -o a-14.o a.cpp
    (with 15.0) icpc -c -o b-15.o b.cpp
    (with 14.0) icpc a-14.o b-15.o <--- May fail with unresolved symbol error
    (with 15.0) icpc a-14.o b-15.o <--- Succeeds

     

For more complete information about compiler optimizations, see our Optimization Notice.