To allow Lua script to use a C++ library's classes and functions, I recommend SWIG: it takes care of all error checking, type conversions etc. And your SWIG files can be used to make your C++ lib available to other languages with basically no extra work, like C# and Python. I have used it in many production systems.
To allow a C++ app or library to call Lua code, I wrote lua-icxx, also used in production system (but only a couple). A nice thing with lua-icxx is that you no longer need to worry about managing Lua stack (unless you want to ;). If you want your app's Lua code to call back into your app's C++ code, you just use both SWIG and lua-icxx together.