I use boost.test. I moved to it from cppunit, which was good but too java like, this was a problem because junit uses reflection to find and run your tests, since this is not available in c++ you have to use macros to register your tests, in cppunit you have to declare, register and define your tests in three different places. boost.test lets you declare, register and define your test in one statement this is very nice.
My general approach is to TDD new code and try to use unit test judiciously for legacy code. I esp test any code that is different on different platforms to ensure they behave the same and continue to behave the same.
I structure my projects so that every library or executable project also has a unit test project. For executable tests, I include the executable source files (except main) in the test project and add my test in new files. For library tests, I normally just link to the library except when I am testing private parts of dlls then I use the executable approach.
Using CMake enables you to abstract any duplication between source project and test project. Also CTest integrates well with any unit testing framework that package tests in executables. This lets you run all test executables in a solution in one go and reports a summary of the results. It also integrates with a continuous integration framework called CDash.
A note on TDD, a lot of people treat this as Test driven development but it can be Test Driven Design. This is a very good way to focus on agile design, using TDD for designing my software as well as writing it really opened my eyes.