A well defined project can be estimated.
Well-defined by design not by functionality or goal. It's pointless when you can't be sure whether your design is seriously flawed.
Which happens to us all the time because we do new types of projects every 2 years or so. My current project built on World Wind Java ended up having the core parts of WWJ re-analyzed, abandoned/replaced and partially rewritten due to very terrible rendering performance on modern hardware, which cannot be seen in prototype with small amounts of objects, plus lots of time tracking and fixing bugs inside Eclipse RCP and JavaFX.
Can it be avoided? yes, by studying the source code of all libraries used in every new projects. That would probably cost us more than the entire project itself.