cancel
Showing results for 
Search instead for 
Did you mean: 

Error -128 calling k(0, ...) from same process

samsogade
New Contributor
In my shared object I have

K ret = k(0, (S)"0N!`hello", (K)0);

If I call the above code from the current process I receive ret == -128 and ret->s will return (null). However, if I open two processes, one listening on port 5010 and another process with the code

K handle = kph((S)"localhost", 5010);
K ret = k(0, (S)"0N!`hello", (K)0);

There are no problems, and the process running on port 5010 will as expected print 

`hello
`hello

Any ideas why I can run the code in the same process?
10 REPLIES 10

charlie
New Contributor II
New Contributor II
for a shared object, do not link with c.o as those functions etc already exist within the kdb+ process.

Thanks Charles. How can I compile anything without linking to c.o?

I can send the data from one q process to another, but not to itself where the shared object is loaded, i.e. k(0,...)?

charlie
New Contributor II
New Contributor II
to create a shared lib on linux using gcc, the cmd line for compiling would be

gcc -DKXVER=3 a.c -o a.so -fPIC -shared

the functions such as ktn etc are resolved when loading into kdb+.

charlie
New Contributor II
New Contributor II
btw, for developing shared libs, refer to


noting that if you are developing a lib to load into kdb+2.x define KXVER=2
and for v3.x define KXVER=3

Thanks a lot!

One more issue: My dynamic shared object does not contain any exported symbols. My C++ code contains some functions that are defined like extern "C" myfunc(). From the terminal I can see that myfunc() is not being exported:

nm -f feed_handler.so 

         U dyld_stub_binder


file feed_handler.so 

         feed_handler.so: Mach-O dynamically linked shared library i386


Is my compilation messed up?

charlie
New Contributor II
New Contributor II
can you provide a very simple test cpp file, .e.g

#include"k.h"
extern "C" K f(K x){R (K)0;}

and your compile cmd line?
and compiler version

Ok, so I can compile your example. However, if I use other functions such as k(), ki(), khp(), etc. I'm getting 'Undefined symbols':

#include "k.h"
extern "C" K f(K x){R (K)0;}
extern "C" K add(K x,K y)
{
R ki(x->i+y->i);
}

compiling:

clang++ -DKXVER=3 -m32 -fPIC -shared -stdlib=libc++ -std=c++11 test.cpp -o test.so

Undefined symbols for architecture i386:

  "_ki", referenced from:

      _add in test-d49315.o

ld: symbol(s) not found for architecture i386

clang: error: linker command failed with exit code 1 (use -v to see invocation)




charlie
New Contributor II
New Contributor II
i think you need

-undefined dynamic_lookup 

Thanks a lot Charles

Apologies, the code above should read

K handle = kph((S)"localhost", 5010);
K ret = k(handle, (S)"0N!`hello", (K)0);