I think I know what's going on.
Unity.cpp contains Verbose.cpp and Client.cpp
-Verbose.cpp has the implentation of print.
-Client.cpp includes Verbose.hpp which brings in the implementation of print.
So Unity.obj has 2 implementations of print.
This means that the library (LibProj.lib) contains one .obj file with print duplicates. So when we try link to the library, the compiler doesn't know which print to use.
The reason why this works on regular builds is that normally, Verbose.cpp creates Verbose.obj which contains an implementation of print in it, and Client.cpp creates Client.obj which contains an implementation of print in it as well. This means that the library (LibProj.lib) contains two .obj files with print defined in each, so the compiler picks one (I don't know how, though).
To test this theory, I created 2 Unity files.
Unity.cpp includes Verbose.cpp
Unity2.cpp includes Client.cpp
With this implementation, I'm able to build. That's because LibProj.lib now has two .obj files (Unity.obj & Unity2.obj), each containing an implementation of print, so there's no symbol clashing.
This is just an educated guess and I reserve the right to be wrong :). However, if I'm wrong, please correct me.
Thanks.