Usually the strace command or setting the LD_DEBUG=all environment variable can provide useful info. They often reveal that I should have the LD_LIBRARY_PATH differently.
An annoyance of dynamic linking is that you also need to make sure that each shared object's own shared object dependencies are in the library path. Often when dynamic linking is complaining about something at appears to clearly exist, it is this recursive linking that is the problem.