Hi, to get the main() more clean, I moved the command line options parser to an own class (some stuff missing): ---8--- class CommandLineOptions { public: CommandLineOptions( int argc, char** argv ); private: po::options_description generic_options; po::options_description qt4_common; #if defined( Q_OS_UNIX ) || defined( Q_OS_MAC ) po::options_description qt4_x11; #endif #if defined( Q_OS_WIN ) po::options_description qt4_win; #endif #if defined DEBUG po::options_description qt4_dbg; #endif po::options_description hidden_options; po::options_description usage_options; po::options_description cmdline_options; po::positional_options_description pos_options; po::variables_map vm; }; --->8--- with ---8<--- CommandLineOptions::CommandLineOptions( int argc, char** argv ) : generic_options("Generic options"), qt4_common("Qt options"), #if defined( Q_OS_UNIX ) || defined( Q_OS_MAC ) qt4_x11( "Qt X11 specific options" ), #endif #if defined( Q_OS_WIN ) qt4_win( "Qt Windows specific options" ), #endif #if defined( DEBUG ) qt4_dbg( "Qt debug options" ), #endif hidden_options("Hidden options") { generic_options.add_options() ( "version,v", "print version string") ( "help,h", "produce help message") ; hidden_options.add_options()(...); qt4_common.add_options()(... #if defined( Q_OS_UNIX ) || defined( Q_OS_MAC ) qt4_x11.add_options()(... #if defined( Q_OS_WIN ) qt4_win.add_options()(... #if defined( DEBUG )(... usage_options .add( generic_options ) .add( qt4_common ) #if defined( Q_OS_UNIX ) || defined( Q_OS_MAC ) .add( qt4_x11 ) #elif defined( Q_OS_WIN ) .add( qt4_win ) #endif #if defined( DEBUG ) .add( qt4_dbg ) #endif ; cmdline_options.add( usage_options ).add( hidden_options ); pos_options.add( "input-file", -1 ); po::store(po::command_line_parser(argc, argv). options(cmdline_options).positional(pos_options).run(), vm); po::notify(vm); if (vm.count( "version" )) { std::cout << Version() << "\n"; } ... } --->8--- and the main(): ---8<--- int main( int argc, char **argv ) { try { logging::init(); CommandLineOptions cmdline( argc, argv ); QT_REQUIRE_VERSION( argc, argv, QT_VERSION_STR ); Q_INIT_RESOURCE( workbench ); QApplication app( argc, argv ); QMainWindow wb; wb.show(); // using boost.logging v2 L_ << "execute application."; return app.exec(); ... --->8--- It works fine until the app exits. My gdb session wasn't very useful to me: (gdb) target exec ./edas (gdb) run Starting program: /.../edas2/edas Using host libthread_db library "/lib/i686/cmov/libthread_db.so.1". (no debugging symbols found) (no debugging symbols found) (no debugging symbols found) (no debugging symbols found) [Thread debugging using libthread_db enabled] [New Thread 0xb70506c0 (LWP 13445)] [New Thread 0xb6aa5b90 (LWP 13450)] 28:31 [1] execute application. Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0xb70506c0 (LWP 13445)] 0x08051980 in ?? () (gdb) backtrace #0 0x08051980 in ?? () If I comment out my CommandLineOptions class instance it works. Thanks, Olaf