cancel
Showing results for 
Search instead for 
Did you mean: 

Problems extending with c, shared object file not found [linux

adnan_gazi01
New Contributor
So I'm trying to have a c function "start" which launches a java program using a system call:
Here's what it looks like

#define KXVER 3
#include"k.h"
#include <stdlib.h>
#include <stdio.h>

void start(K something)
{
    printf("starting java");
    system("java Prog hello there"); 
}


I compiled this as bar.so, using the command shown on Cookbook/ExtendingwtihC on the wiki, and placed it in my ~/q/ directory along with Prog.class.
(The only thing Prog.class does is print out its arguments).
The compilation was fine, there was no issue with k.h or anything else.

But when I try to call the function within q using

q)start: `bar 2:(`start;1)


I get an error saying:

'bar.so: cannot open shared object file: No such file or directory

I've tried putting the .so and .class files pretty much everywhere, inside l32, in the home directory, etc. but I still get this error.
Ive set my QHOME variable to /q/, and echoing $QHOME shows that.

I have no idea what to do next, and I really need this to work, so any help will be greatly appreciated.

Thanks


10 REPLIES 10

pawel_tryfon
New Contributor
Adnan,

Did you add .so file location to LD_LIBRARY_PATH?

Thanks,
Pawel Tryfon


2013/12/22 Adnan G <adnan.gazi01@gmail.com>
So I'm trying to have a c function "start" which launches a java program using a system call:
Here's what it looks like

#define KXVER 3
#include"k.h"
#include <stdlib.h>
#include <stdio.h>

void start(K something)
{
    printf("starting java");
    system("java Prog hello there"); 
}


I compiled this as bar.so, using the command shown on Cookbook/ExtendingwtihC on the wiki, and placed it in my ~/q/ directory along with Prog.class.
(The only thing Prog.class does is print out its arguments).
The compilation was fine, there was no issue with k.h or anything else.

But when I try to call the function within q using

q)start: `bar 2:(`start;1)


I get an error saying:

'bar.so: cannot open shared object file: No such file or directory

I've tried putting the .so and .class files pretty much everywhere, inside l32, in the home directory, etc. but I still get this error.
Ive set my QHOME variable to /q/, and echoing $QHOME shows that.

I have no idea what to do next, and I really need this to work, so any help will be greatly appreciated.

Thanks


--
You received this message because you are subscribed to the Google Groups "Kdb+ Personal Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to personal-kdbplus+unsubscribe@googlegroups.com.
To post to this group, send email to personal-kdbplus@googlegroups.com.
Visit this group at http://groups.google.com/group/personal-kdbplus.
For more options, visit https://groups.google.com/groups/opt_out.

echo $LD_LIBRARY_PATH

produces nothing, so it's empty right?

How would I add the location? Do I just export ~/q/ to the name of the variable?

Do

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib/directory


HTH,
Pawel Tryfon


2013/12/22 Adnan G <adnan.gazi01@gmail.com>
echo $LD_LIBRARY_PATH

produces nothing, so it's empty right?

How would I add the location? Do I just export ~/q/ to the name of the variable?

ah ok thanks, looks like its able to find it. But I'm getting another error now:

q)`bar 2:(`start, 1)
'bar.so: wrong ELF class: ELFCLASS64


I'm running 64-bit java, and q is the 32-bit trial. Maybe that's something to do with it?

it looks like you compiled your shared library to be 64bit.
If you are loading it into 32bit kdb+, you should compile with -m32 flag to gcc.

btw, your c function should return either null or a ptr to a valid kobject.
e.g.

K start(K something)
{
    printf("starting java");
    system("java Prog hello there");  
    return 0;
}

Thanks, looks like its trying to execute the .so file.
But I'm getting a code error when running this:

q)`bar 2:(`start;1)
code

The function in the .c file is this:

K start(K something)
{
    system("java Prog hello there");  
    return 0;
}

And also, executing

q)`bar 2:(`start;1)[`something]

gives a 'type error for any parameter I give it. Do you know why?


On Monday, December 23, 2013 11:25:40 AM UTC, Charles Skelton wrote:
it looks like you compiled your shared library to be 64bit.
If you are loading it into 32bit kdb+, you should compile with -m32 flag to gcc.

btw, your c function should return either null or a ptr to a valid kobject.
e.g.

K start(K something)
{
    printf("starting java");
    system("java Prog hello there");  
    return 0;
}

if you are loading into kdb+3.0 upwards, or using the latest c libs, use KXVER=3

otherwise use KXVER=2

The pre def at the top says

#define KXVER 3

But it was always like that. I still don't know why its giving me a code error.

q)`bar 2:(`start;1)
code

is not an error. This is just the display for a function that is implemented in a shared library. e.g.

q)f:`bar 2:(`start;1)
q)f
code

the type error is from missing (), i.e.

q)(`bar 2:(`start;1))[`something]

otherwise it is doing 

q)(`start;1)[`something]
'type



Oh wow, you're right, it worked. Thanks a lot!