The problem is not with xMate. The job of any builder ends with generating the script and executing the compiler and linker. xMate did its job well as can be seen from the link script.
Now the real question what the linker does.
Assume that I am linking MyLib.Lib first and then FiveX.Lib next.
I have a function func1() in module mymod1.prg in mylib.lib
There are two functions func1() and func2() in module fwmod1.prg in fivex.lib.
My application prg has a call to func1() and does not call func2() directly or indirectly.
Now the linker has no confusion. The linker links mymod1.obj from mylib.lib (priority) ignoring fwmod1.obj in fivex.lib.
Next:
Assume I revised my application. Now my application calls some function which in turn calls func2() which is only in fwmod1.obj inside fivex.lib.
What does the linker do? The linker has to link both func1() and func2() and it finds mymod1.obj in mylib.lib which contains func1() only and module fwmod1.obj inside fivex.lib which contains both func1() and func2(). Which module does it include in the exe?
Let us keep in mind that linker links entire modules and does not split modules for different functions ( unlike Blinker in the good old 16-bit clipper days)
Now the logical choice for the linker is to choose fwmod1.obj from fivex.lib instead of mymod1 from mylib.lib. Extending this logic we can also expect situations where duplicate symbols may need to be linked but that generates a log file to indicate the issue.
I happily stand corrected where I am wrong if pointed out by our experts.
I always feel that having functions with the same names as in fivewin or (x)Harbour (or 3rd party libs we are using) is like carrying timebombs in our pockets. It is definitely worth all the time we spend to avoid conflicting names of functions.
It is a good thing that FWH is now prefixing "FW_" before any new utility functions being added to FWH libs.