#pragma interface
#endif
+#include <wx/setup.h>
+
+#if wxUSE_DYNLIB_CLASS
+
#include <wx/string.h>
#include <wx/list.h>
#include <wx/hash.h>
-// TODO should be done by configure
-#if defined(__UNIX__) && !(defined(HAVE_DLOPEN) || defined(HAVE_SHLLOAD))
+// this is normally done by configure, but I leave it here for now...
+#if defined(__UNIX__) && !(defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD))
#if defined(__LINUX__) || defined(__SOLARIS__) || defined(__SUNOS__) || defined(__FREEBSD__)
#define HAVE_DLOPEN
#elif defined(__HPUX__)
- #define HAVE_SHLLOAD
+ #define HAVE_SHL_LOAD
#endif // Unix flavour
#endif // !Unix or already have some HAVE_xxx defined
#include <dlfcn.h>
typedef void *wxDllType;
-#elif defined(HAVE_SHLLOAD)
+#elif defined(HAVE_SHL_LOAD)
#include <dl.h>
- typedef void *wxDllType;
+ typedef shl_t wxDllType;
#elif defined(__WINDOWS__)
#include <windows.h>
wxHashTable classTable;
public:
- wxLibrary(void *handle);
+ wxLibrary(wxDllType handle);
~wxLibrary();
// Get a symbol from the dynamic library
return wxClassInfo::GetFirst(); \
}
+#endif // wxUSE_DYNLIB_CLASS
+
#endif // _WX_DYNLIB_H__
#pragma hdrstop
#endif //__BORLANDC__
+#if wxUSE_DYNLIB_CLASS
+
#include "wx/dynlib.h"
#include "wx/filefn.h"
#include "wx/intl.h"
#include "wx/log.h"
+#include "wx/tokenzr.h"
// ----------------------------------------------------------------------------
// conditional compilation
#define wxDllOpen(lib) dlopen(lib, RTLD_LAZY)
#define wxDllGetSymbol(handle, name) dlsym(handle, (char *)name)
#define wxDllClose dlclose
-#elif defined(HAVE_SHLLOAD)
- #define wxDllOpen(lib) shl_open(lib, BIND_DEFERRED, 0)
+#elif defined(HAVE_SHL_LOAD)
+ #define wxDllOpen(lib) shl_load(lib, BIND_DEFERRED, 0)
#define wxDllClose shl_unload
- static inline void *wxDllGetSymbol(shl_t *handle, const char *name)
+ static inline void *wxDllGetSymbol(shl_t handle, const char *name)
{
void *sym;
- if ( shl_findsym(handle, name, TYPE_UNDEFINED, &sym) == 0 )
+ if ( shl_findsym(&handle, name, TYPE_UNDEFINED, &sym) == 0 )
return sym;
else
return (void *)0;
wxString fullname(basename);
#if defined(__UNIX__)
- fullname << ".so";
+ #if defined(__HPUX__)
+ fullname << ".sl";
+ #else //__HPUX__
+ fullname << ".so";
+ #endif //__HPUX__
#elif defined(__WINDOWS__)
fullname << ".dll";
#endif
wxString lib_name = ConstructLibraryName(name);
#if defined(__UNIX__)
- // TODO use LD_LIBRARY_PATH!
- lib_name.Prepend("/lib");
+ // found the first file in LD_LIBRARY_PATH with this name
+ wxString libPath("/lib:/usr/lib"); // system path first
+ const char *envLibPath = getenv("LD_LIBRARY_PATH");
+ if ( envLibPath )
+ libPath << ':' << envLibPath;
+ wxStringTokenizer tokenizer(libPath, ':');
+ while ( tokenizer.HasMoreToken() )
+ {
+ wxString fullname(tokenizer.NextToken());
+
+ fullname << '/' << lib_name;
+ if ( wxFileExists(fullname) )
+ {
+ lib_name = fullname;
+
+ // found the library
+ break;
+ }
+ }
+ //else: not found in the path, leave the name as is (secutiry risk?)
+
#endif // __UNIX__
- wxDllType handle ;
+ wxDllType handle;
#if defined(__WXMAC__)
FSSpec myFSSpec ;
}
return NULL;
}
+
+#endif // wxUSE_DYNLIB_CLASS