Ciao a tutti, ho fatto un porting in Windows XP di un programma scritto in C++ per Linux.
Per fare in fretta ho usato l'ambiente di programmazione Qt 4.8.2 per il compilatore MinGW 4.6.2
In tale programma scritto per Linux originariamente si fa uso della libreria libtool per caricare le librerie dinamiche.
Di seguito riporto il pezzo di codice interessato:
void Model::LoadControllerModule( const char *lib )
{
printf( "[Ctrl \"%s\"]\n", lib );
// Initialise libltdl.
int errors = lt_dlinit();
if (errors)
{
printf( "Libtool error: %s. Failed to init libtool. Quitting\n",
lt_dlerror() ); // report the error from libtool
puts( "libtool error #1" );
fflush( stdout );
exit(-1);
}
printf( "[STAGEPATH: %s]\n", FileManager::stagePath().c_str());
lt_dlsetsearchpath( FileManager::stagePath().c_str() );
printf( "ltdl search path: %s\n", lt_dlgetsearchpath() );
// PLUGIN_PATH now defined in config.h
lt_dladdsearchdir( PLUGIN_PATH );
printf( "ltdl search path: %s\n", lt_dlgetsearchpath() );
lt_dlhandle handle = NULL;
// the library name is the first word in the string
char libname[256];
sscanf( lib, "%s %*s", libname );
printf( "libname: %s\n", libname );
if(( handle = lt_dlopenext( libname ) ))
{
model_callback_t initfunc = (model_callback_t)lt_dlsym( handle, "Init" );
if( initfunc == NULL )
{
printf( "(Libtool error: %s.) Something is wrong with your plugin.\n",
lt_dlerror() ); // report the error from libtool
puts( "libtool error #1" );
fflush( stdout );
exit(-1);
}
// pass complete string into initfunc
AddCallback( CB_INIT, initfunc, new CtrlArgs(lib, World::ctrlargs) );
}
else
{
printf( "(Libtool error: %s.) Can't open your plugin.\n",
lt_dlerror() ); // report the error from libtool
PRINT_ERR1( "Failed to open \"%s\". Check that it can be found by searching the directories"
"in your STAGEPATH environment variable, or the current directory if STAGEPATH "
"is not set.]\n", libname );
printf( "ctrl \"%s\" STAGEPATH \"%s\"\n", libname, PLUGIN_PATH );
puts( "libtool error #2" );
fflush( stdout );
exit(-1);
}
fflush(stdout);
}
Come dicevo prima ho usato l'ambiente Qt per risolvere il problema impiegando la classe QLibrary
di seguito riporto il codice che sostituisce quello sopra riportato:
void Model::LoadControllerModule( const char *lib )
{
printf( "Model::LoadControllerModule() - [Ctrl \"%s\"", lib );
fflush(stdout);
char libname[256];
strcpy(libname, lib);
printf( "\nModel::LoadControllerModule() - libname = %s\n", libname );
QLibrary library(libname);
model_callback_t initfunc = (model_callback_t)library.resolve("Init");
printf( "]" );
if(initfunc == 0)
{
// report the error from QLibrary
printf("\nModel::LoadControllerModule() - QLibrary error(%s) \nSomething is wrong with your
plugin.\n", library.errorString().toStdString().c_str());
printf("QLibrary error #1\n");
return;
}
// pass complete string into initfunc
AddCallback(CB_INIT, initfunc, new CtrlArgs(lib, World::ctrlargs));
}
Così facendo funziona benissimo.
Ora vorrei trovare una soluzione che non faccia uso delle Qt 4.8.2 ma che usi normale codice in MinGW 4.7.1 usando come IDE Code::Blocks 13.12.
Mi potete aiutare a tal proposito ?