| PathEngine home | previous: | next: |
The GCC based build setup generates a .so file instead of a .dll.
This is essentially a Linux equivalent to a Windows dll.
The following code shows how PathEngine can be loaded as a .so, and an entry point obtained:
#include "i_pathengine.h"
#include "PathEngine_DirectLinkage.h"
#include <dlfcn.h>
#include <stdio.h>
#include <signal.h>
class cErrorHandler : public iErrorHandler
{
public:
eAction handle(const char* type, const char* description, const char *const* attributes)
{
printf("Error handler called:\n");
printf(type);
printf("\n");
printf(description);
printf("\n");
raise(SIGTRAP);
return CONTINUE;
}
};
cErrorHandler gErrorHandler;
int
main (int argc, char* argv[])
{
const char* errorString;
void* handle = dlopen("./libPathEngine.so", RTLD_NOW);
if(!handle)
{
printf("!handle\n");
errorString = dlerror();
if(errorString)
{
printf(errorString);
}
return 1;
}
iPathEngine* (*PathEngine_InitialiseAndObtainRootInterface_Pointer)(iErrorHandler*);
void (*PathEngine_ShutDown_Pointer)();
dlerror();
*(void **)(&PathEngine_InitialiseAndObtainRootInterface_Pointer) = dlsym(handle, "PathEngine_InitialiseAndObtainRootInterface");
errorString = dlerror();
if(errorString)
{
printf(errorString);
printf("\n");
dlclose(handle);
return 1;
}
*(void **)(&PathEngine_ShutDown_Pointer) = dlsym(handle, "PathEngine_ShutDown");
errorString = dlerror();
if(errorString)
{
printf(errorString);
printf("\n");
dlclose(handle);
return 1;
}
iPathEngine* pathEngine = (*PathEngine_InitialiseAndObtainRootInterface_Pointer)(&gErrorHandler);
if(pathEngine->getInterfaceMajorVersion() != PATHENGINE_INTERFACE_MAJOR_VERSION
||
pathEngine->getInterfaceMinorVersion() < PATHENGINE_INTERFACE_MINOR_VERSION)
{
gErrorHandler.handle("Fatal", "LoadPathEngine: pathengine version is incompatible with headers used for compilation.", 0);
return false;
}
// *** do things with the API here
(*PathEngine_ShutDown_Pointer);
int error = dlclose(handle);
if(error)
{
printf("error from dclose()\n");
return 1;
}
return 0;
}
|
In order to make these dll calls your application is likely to need an additional '-ldl' linker switch.
(This and other details for the exact setup to use for shared object linkage may of course vary slightly between different Linux distributions,
and across other platforms where a GCC build setup is used.)
The 'LoadPathEngine' example project shows this linkage in action.
| Documentation for PathEngine release 6.04 - Copyright © 2002-2024 PathEngine | next: |