I guess the first thing you should do to determine the compiler version unless you literally mean the compiler version instead of linker version, is inspect the "MajorLinkerVersion" and "MinorLinkerVersion" fields of the PE header of the executable, be it EXE, DLL, or SYS. See list below.
0x5 0x0 (5.0) Borland C++ / MS Linker 5.0
0x6 0x0 (6.0) Microsoft VIsual Studio 6
0x7 0xA (7.10) Microsoft VIsual Studio 2003
0x8 0x0 (8.0) Microsoft VIsual Studio 2005
0x9 0x0 (9.0) Microsoft VIsual Studio 2008
0xA 0x0 (10.0) Microsoft VIsual Studio 2010
0x2 0x15 (2.21) MinGw
0x2 0x19 (184.108.40.206) Borland Delphi (linker 220.127.116.11)
Unfortunately, packers and protectors tend to overwrite these value to write their own and/or harden the process of guessing the original compiler.
Also, the resource directory of an executable is a good place to search for specific linker info. e.g. RT_RCDATA having a resource named "DVCLAL" is a sign of Borland C++ or Delphi and the "RT_MANIFEST" in case of a MSVC-built executable can tell us about the specfic version of runtime DLL's it is linked to and hence the compiler version.
Also, an executable with the "TimeDateStamp" field set to 0x2A425E19 is a sign of being built with Delphi.
Now, if you want to determine compiler from assembly code, then the sign of a recent MSVC compiler version is seeing the function that generates the stack cookie just at the entry point.
Seeming, a JMP instruction at the entry point followed by the string "fb:C++Hook" is a sign of Borland C++, and so on.