[C][RPC][Solaris]Not compiling client/server

Hello,
I have task to make a program that multiplies polynomials as client(input/output indexes)-server(multiplying) using RPC. However when I try to compile it with gcc it gives the next info:

for client:
Udefined first
symbol referenced
Clnt_create client.o

for server:
Udefined first
symbol referenced
mlt_proc_1 mlt_svc.o

What could be done with it?(Some libs problems(?), mb missing some include files?)

here the listings:
mlt.x

struct mlt_in { /*   () */
int f[20];
int g[20];
};

struct mlt_out { /*   () */
int d[40];
};

program MLT_PROG {
version MLT_VERS {
mlt_out MLTPROC(mlt_in) = 1; /*   = 1 */
} = 1;
} = 0x31230000;

client.c

#include "mlt.h" /*rpcgen */
#include <stdio.h>
#include <rpc/rpc.h>
#include <sys/types.h>

CLIENT *Clnt_create(const char *host, unsigned long prognum, unsigned long versnum, const char *protocol);
int
main()
{
int i,j,m,q,r,s;
CLIENT *cl;
mlt_in in;
mlt_out *outp;
cl = Clnt_create("127.0.0.1", MLT_PROG, MLT_VERS, "tcp");
printf("Insert dimension 1\n");
scanf("%i", q);
printf("\nInsert dimension 2\n");
scanf("%i", r);
printf("Insert indexes from 0 to 20");

for(i=0; i<20; i++)
{
scanf("%i", in.f);
printf("%i\t", in.f);
};

printf("Insert indexes from 0 to 20");
for(j=0; j<20; j++)
{
scanf("%i", in.g[j]);
printf("%i\t", in.g[j]);
};

if ((outp = mltproc_1(&in, cl)) == NULL)
printf("error occured");
printf("\n");
for(m=0; m<=(r+q);m++)
{
printf("%i\t", outp->d[m]);
};

exit(0);
}

server.c

#include "mlt.h"
#include <stdio.h>
#include <rpc/rpc.h>
#include <sys/types.h>


mlt_out *
mltproc_l_svc(mlt_in *inp, struct svc_req *rqstp)
{
static mlt_out out;
int k, i;
int s = 40;
for(k=0; k<=s;k++)
{
out.d[k]=0;
for(i=0; i<=k;i++)
{
out.d[k]=inp->f*inp->g[k-i];
};
};

/*out.d[1] = inp->f[19] * inp->g[19];*/

return(&out);
}

How exactly are you compiling it?

1) each .c file:
gcc -c .c ( - name of the file)
I receive .o files - no problems.
2) then
gcc client.o mlt_clnt.o mlt_xdr.o -o client -lnsl

Ofcourse before using gcc I use rpcgen:
rpcgen mlt.x

Keep in mind that include files don't include libraries -- they only tell the compiler what functions ought to exist. So no matter how many include files you add, that will never resolve "undefined external" errors. "unresolved external" means more than one .c or .o file was required to completely build one executable, because they were using parts of each other -- or a library was missing.

You shouldn't be using raw gcc to build your RPC programs. There are many source files, some which need to be compiled together, some which shouldn't, and which belongs where kind of depends on what your RPC generator generated.

Usually you'd do this:

# Convert your template into code you can fill out.
# It also builds a makefile for you, which knows how to build your server
# and client programs.
rpcgen -a -C mlt.x
vim mlt_server.c # Edit your own code into mlt_server.c
vim mlt_client.c # Edit your own code into mlt_client.c
make -f Makefile.mlt mlt_client mlt_server

When I do that, I get:

$ make -f Makefile.mlt mlt_server mlt_client
make[1]: Entering directory `/home/username/code/c/1shot/rpc'
cc -g    -c -o mlt_svc.o mlt_svc.c
cc -g    -c -o mlt_server.o mlt_server.c
cc -g    -c -o mlt_xdr.o mlt_xdr.c
cc -g     -o mlt_server  mlt_svc.o mlt_server.o mlt_xdr.o -lnsl
cc -g    -c -o mlt_clnt.o mlt_clnt.c
cc -g    -c -o mlt_client.o mlt_client.c
cc -g     -o mlt_client  mlt_clnt.o mlt_client.o mlt_xdr.o -lnsl
make[1]: Leaving directory `/home/username/code/c/1shot/rpc'

$

So mlt_server needs mlt_svc.c, mlt_server.c, and mlt_xdr.c all at the same time.

And mlt_client needs mlt_clnt.c, mlt_client.c, and mlt_xdr.c all at the same time.

They also both need -lnsl.

---------- Post updated at 11:17 AM ---------- Previous update was at 11:13 AM ----------

Having done all of this, I finally see what the error is.

In the autogenerated code, I find:

clnt = clnt_create (host, MLT_PROG, MLT_VERS, "udp");

In your code, you have:

CLIENT *Clnt_create(const char *host, unsigned long prognum, unsigned long versnum, const char *protocol);

C function names are Case Sensitive.

oh) thank u very much!

You should not be declaring clnt_create, by the way. That's a library function. I'm guessing you did so to get around 'undeclared function' warnings, but the real problem wasn't that it was undeclared, but that it didn't exist at all...