[Mono-devel-list] Need help with DllImport.
Jonathan Pryor
jonpryor at vt.edu
Fri Jun 3 18:22:30 EDT 2005
On Fri, 2005-06-03 at 09:56 -0400, Gary M. Smithrud wrote:
> The DLL containing the InitializeKnowledgeBase relies on other shared
> libraries that are also part of the project and under Mono 1.1.4 I could
> create a single library that reference the others and it would work then
> (definitely not ideal).
Sounds like you're improperly linking your library. When you link your
library, you should link against all other dependent libraries:
$ gcc -shared -out libfoo.so foo.c -ldep1 -ldep2 -ldep3 # ...
A perfect prior example is creating a C++ shared library which uses
`std::cout` but using `gcc` instead of `g++` to link the .so. This
results in libstdc++.so *not* being loaded at runtime, resulting in
strange library loading errors like you're describing.
The perfect test for this is a small program which dlopen(3)'s your
library with RTLD_NOW. If it can be loaded, your library is fine,
otherwise you have a dependency problem. (dlerror(3) can be used to
obtain an error message after a failed attempt loading the library.)
For example:
/*
* dlopen test program for libraries
*
* Compile as: gcc -o dltest dltest.c -ldl
*/
#include <stdio.h>
#include <dlfcn.h>
int
main (int argc, char **argv)
{
int i;
for (i = 1; i < argc; ++i) {
void *h;
h = dlopen (argv [i], RTLD_NOW);
if (h == NULL)
printf ("error loading library `%s': %s",
argv [i], dlerror ());
if (h != NULL)
dlclose (h);
}
return 0;
}
The other thing to keep in mind is that mono translates SIGSEGV into a
System.NullReferenceException, so it's possible that you're getting a
null pointer in InitializeKnowledgeBase (perhaps bad structure
marshaling?), resulting in a SIGSEGV, and hence the
NullReferenceException.
- Jon
More information about the Mono-devel-list
mailing list