Re: Start by actually writing your own code!
I would argue the exact opposite. Using a library means taking code that has been designed to do a purpose and using it for that purpose. The library will have a clear and sensible API to achieve the goal you are attempting (and if it doesn't, don't use that library, use another or adjust your mentality).
NIH is more of a problem to be honest. With NIH you get the same problems with wrapper libraries, except there is no well thought out interface there at all, and each wrapper of NIH code makes it increasingly more difficult to debug and determine what is happening. Worst, each wrapper will probably not be self contained in its own library, but inter-coupled with other code in your project.
Also, as the author of more than one wrapper library myself, the purpose of a wrapper library is to take a complex and powerful library API and condense it to the point where it does the few things you need the library to do in a concise and clear manner. It makes writing code simpler whilst using the power of the original library.
For instance, I have an application that has to sign, verify, decrypt and encrypt XML documents in a bunch of places. I wrote a small wrapper library around libxmlsec1 which provides the API needed by our application without needing to go in to the nitty gritty of how to make those calls solely using libxmlsec1. In fact, this is a great example as libxmlsec1 is itself actually a wrapper around openssl and libxml2.