[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: dlsym() and C++
Quoting Dennis Payne (payned@rpi.edu):
> Looks like I was right.  Although that doesn't explain why your code was
> crashing.
I've checked the code in ClanLib, and the actual cout did print the address
of the pointer (this time it is a paste, and not a rewrite of the main):
int main(int argc, char **argv)
{
    timeval tv;
    gettimeofday(&tv, NULL);
    _begin_time =
         (long) tv.tv_sec * (long) 1000+
         (long) tv.tv_usec / (long)1000;
    cout << endl;
    cout << "ClanLib - the platform independent game sdk - Linux version."
         << endl;
    cout << endl;
    if (CL_ClanApplication::app == NULL)
    {
        cout << "ClanLib: No global CL_ClanApplication instance!!!" << endl;
        return 255;
    }
    cout << "Querying system configuration." << endl;
#ifdef USE_DYN
    cout << "[[1mDynamic linking ENABLED[[0m" << endl;
    cout << "address of gzdopen: " << &gzdopen << endl;
    gzdopen = NULL;   // <-- it crashes here
    DynLib_libz libz;
    gzdopen = NULL;  
    if (!libz.link()) return 255;
#ifdef USE_X11
    DynLib_libx11 libx11;
    DynLib_libxext libxext;
    if (!libx11.link()) return 255;
    if (!libxext.link()) return 255;
#endif
#ifdef USE_SVGALIB
    DynLib_libvga libvga;
    if (!libvga.link()) return 255;
#endif
#endif
    // [the rest of clanlib's initialization here...]
    int retval = app->main(argc, argvv);
    // [deinit here]
    return retval;
}
The actual declare of the gzdopen pointer is stored in an other header file:
#ifndef USE_DYN
#include <zlib.h>
#else
#include "../detect.h"
extern "C"
{
    typedef void* gzFile;
                         
    DYNFUNC gzFile (*gzdopen)(int, const char *);
    DYNFUNC int (*gzclose)(gzFile);              
    DYNFUNC int (*gzread)(gzFile, void *, unsigned int);
}
 
class DynLib_libz : public CL_DynamicLibrary
{
protected:
    virtual void try_link()
    {                      
        filename("libz.so");
        resolve((void**) &gzdopen, "gzdopen");
        resolve((void**) &gzclose, "gzclose");
        resolve((void**) &gzread, "gzread");
    }                                       
};
where DYNFUNC is a define making it possible to include the header file from
other files as well:
#ifdef DYN_LOAD
    #define DYNFUNC
#else
    #define DYNFUNC extern        
#endif /* DYN_LOAD */
I hope the above code reveals something stupid! I'm getting quite
desperate... :-(
-- 
Magnus Norddahl
ClanSoft