Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [RPC][Solaris] Не собирается исполняемый файл 
:(
    Опции темы
Manaarina
Дата 6.1.2012, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



Пишу учебную программку на C, которая является приложением типа клиент-сервер: на сервере перемножает полиномы, а на клиенте вводятся индексы и потом выводиться результат.
При компиляции gcc ругается на функцию Clnt_create и на функцию mltproc_1(эта функция которая создается rpcgen -ом). 
1) Вопрос, что я не так делаю?(возможно не хватает заголовочных файлов или чего-нибудь ещё?)

Udefined  first
symbol  referenced
Clnt_create  client.o

Udefined  first
symbol  referenced
 mltproc_1  mlt_svc.o

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;

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[i]*inp->g[k-i];
};
};



return(&out);
}



client.c
Код

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

CLIENT *сlnt_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[i]);
printf("%i\t", in.f[i]);
};

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);
}


Это сообщение отредактировал(а) Manaarina - 20.1.2012, 10:57
PM MAIL   Вверх
Manaarina
Дата 7.1.2012, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



Разобралась с клиентом(там функция clnt_create с большой у меня была =\)
Осталась проблема с сервером.
PM MAIL   Вверх
xvr
Дата 7.1.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Вы стабы, сгенеренные rpcgen'Ом не забыли включить в линковку?

PM MAIL   Вверх
Manaarina
Дата 7.1.2012, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



А мне незнакомы слова "стаб" или "линковка"
Если стабы - файлы сгенерированные rpcgen-ом все включаю.
Но возможно это что то другое? =(
PM MAIL   Вверх
xvr
Дата 8.1.2012, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Manaarina @  7.1.2012,  13:56 Найти цитируемый пост)
Если стабы - файлы сгенерированные rpcgen-ом все включаю.

Они самые. В одном из .с файлов должна быть ваша функция mltproc_1. Покажите makefile

PM MAIL   Вверх
Manaarina
Дата 19.1.2012, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



Увы, пропала на некоторое время, но всё еще надеюсь на ответ.
Код

client: client.o mlt_clnt.o mlt_xdr.o
        gcc client.o mlt_clnt.o mlt_xdr.o -o client -lnsl
server: server.o mlt_svc.o mlt_xdr.o
        gcc server.o mlt_svc.o mlt_xdr.o -o server -lnsl
client.o: client.c
        gcc -c client.c
server.o: server.c
        gcc -c server.c
file_clnt.o: mlt_clnt.c
        gcc -c mlt_clnt.c
file_svc.o: mlt_svc.c
        gcc -c mlt_svc.c
file_xdr.o: mlt_xdr.c
        gcc -c mlt_xdr.c


PM MAIL   Вверх
bsa
Дата 19.1.2012, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Manaarina, у тебя в правилах не указано куда компилятор должен класть результат своей работы:
Код
client: client.o mlt_clnt.o mlt_xdr.o
        gcc client.o mlt_clnt.o mlt_xdr.o -o client -lnsl
server: server.o mlt_svc.o mlt_xdr.o
        gcc server.o mlt_svc.o mlt_xdr.o -o server -lnsl
client.o: client.c
        gcc -c -o $@ $<
server.o: server.c
        gcc -c -o $@ $<
file_clnt.o: mlt_clnt.c
        gcc -c -o $@ $<
file_svc.o: mlt_svc.c
        gcc -c -o $@ $<
file_xdr.o: mlt_xdr.c
        gcc -c -o $@ $<

PM   Вверх
Manaarina
Дата 19.1.2012, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



bsa ну вообще то он у меня по умолчанию кладет их с такими же названиями но с расширениями .о в ту папку. короче объектные файлы появляются все.
PS На всякий случай я только что проверила, откомпилировав объектные вручную: все получились. при попытке скомпилировать клиент - запускается. при попытке скомпилировать сервер - та же ошибка.
PM MAIL   Вверх
xvr
Дата 19.1.2012, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Ну makefile почти правильный  smile У вас в целях стоят file_*.o, а собираются на самом деле mlt_*.o (они и подаются в линковку). Так что линковаться будет, но все mlt_*.c будут компилироваться каждый раз.

Показывайте исходники

PM MAIL   Вверх
Manaarina
Дата 19.1.2012, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 19.1.2012,  21:47)
Ну makefile почти правильный  smile У вас в целях стоят file_*.o, а собираются на самом деле mlt_*.o (они и подаются в линковку). Так что линковаться будет, но все mlt_*.c будут компилироваться каждый раз.

Показывайте исходники

не тот makefile недоправленный верно =)
а какие исходники вы хотели бы посмотреть?
PM MAIL   Вверх
xvr
Дата 19.1.2012, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Manaarina @  19.1.2012,  21:51 Найти цитируемый пост)
а какие исходники вы хотели бы посмотреть? 

Сам rpc файл, то, что нагенерил rpcgen ну и те места, где эти rpc функции используются

PM MAIL   Вверх
Manaarina
Дата 20.1.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



Сгенерированные файлы:

mlt_clnt.c
Код

/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */

#include "mlt.h"
#ifndef _KERNEL
#include <stdio.h>
#include <stdlib.h> /* getenv, exit */
#endif /* !_KERNEL */

/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = { 25, 0 };

mlt_out *
mltproc_1(argp, clnt) //вот тут  эта функция, на сколько я понимаю, объявлена для клиента -все вроде работает.
    mlt_in *argp;
    CLIENT *clnt;
{
    static mlt_out clnt_res;

    memset((char *)&clnt_res, 0, sizeof (clnt_res));
    if (clnt_call(clnt, MLTPROC,
        (xdrproc_t) xdr_mlt_in, (caddr_t) argp,
        (xdrproc_t) xdr_mlt_out, (caddr_t) &clnt_res,
        TIMEOUT) != RPC_SUCCESS) {
        return (NULL);
    }
    return (&clnt_res);
}



mlt_svc.c - в этом файле она тоже должна быть, но ее нет.
Код

/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */

#include "mlt.h"
#include <stdio.h>
#include <stdlib.h> /* getenv, exit */
#include <signal.h>
#include <sys/types.h>
#include <memory.h>
#include <stropts.h>
#include <netconfig.h>
#include <sys/resource.h> /* rlimit */
#include <syslog.h>

#ifdef DEBUG
#define    RPC_SVC_FG
#endif

#define    _RPCSVC_CLOSEDOWN 120
static int _rpcpmstart;        /* Started by a port monitor ? */

/* States a server can be in wrt request */

#define    _IDLE 0
#define    _SERVED 1

static int _rpcsvcstate = _IDLE;    /* Set when a request is serviced */
static int _rpcsvccount = 0;        /* Number of requests being serviced */

static
void _msgout(msg)
    char *msg;
{
#ifdef RPC_SVC_FG
    if (_rpcpmstart)
        syslog(LOG_ERR, "%s", msg);
    else
        (void) fprintf(stderr, "%s\n", msg);
#else
    syslog(LOG_ERR, "%s", msg);
#endif
}

static void
closedown(sig)
    int sig;
{
    if (_rpcsvcstate == _IDLE && _rpcsvccount == 0) {
        int size;
        int i, openfd = 0;

        size = svc_max_pollfd;
        for (i = 0; i < size && openfd < 2; i++)
            if (svc_pollfd[i].fd >= 0)
                openfd++;
        if (openfd <= 1)
            exit(0);
    } else


mlt_xdr.c
Код

/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */

#include "mlt.h"

bool_t
xdr_mlt_in(xdrs, objp)
    register XDR *xdrs;
    mlt_in *objp;
{

#if defined(_LP64) || defined(_KERNEL)
    register int *buf;
#else
    register long *buf;
#endif

    int i;

    if (xdrs->x_op == XDR_ENCODE) {
        buf = XDR_INLINE(xdrs, (20 + 20) * BYTES_PER_XDR_UNIT);
        if (buf == NULL) {
            if (!xdr_vector(xdrs, (char *)objp->f, 20,
                sizeof (int), (xdrproc_t) xdr_int))
                return (FALSE);
            if (!xdr_vector(xdrs, (char *)objp->g, 20,
                sizeof (int), (xdrproc_t) xdr_int))
                return (FALSE);
        } else {
#if defined(_LP64) || defined(_KERNEL)
            {
                register int *genp;

                for (i = 0, genp = objp->f;
                    i < 20; i++) {
                    IXDR_PUT_INT32(buf, *genp++);
                }
            }
            {
                register int *genp;

                for (i = 0, genp = objp->g;
                    i < 20; i++) {
                    IXDR_PUT_INT32(buf, *genp++);
                }
            }
#else
            {
                register int *genp;

                for (i = 0, genp = objp->f;
                    i < 20; i++) {
                    IXDR_PUT_LONG(buf, *genp++);
                }
            }
            {
                register int *genp;

                for (i = 0, genp = objp->g;
                    i < 20; i++) {
                    IXDR_PUT_LONG(buf, *genp++);
                }
            }
#endif
        }
        return (TRUE);
    } else if (xdrs->x_op == XDR_DECODE) {
        buf = XDR_INLINE(xdrs, (20 + 20) * BYTES_PER_XDR_UNIT);
        if (buf == NULL) {
            if (!xdr_vector(xdrs, (char *)objp->f, 20,
                sizeof (int), (xdrproc_t) xdr_int))
                return (FALSE);
            if (!xdr_vector(xdrs, (char *)objp->g, 20,
                sizeof (int), (xdrproc_t) xdr_int))
                return (FALSE);
        } else {
#if defined(_LP64) || defined(_KERNEL)
            {
                register int *genp;

                for (i = 0, genp = objp->f;
                    i < 20; i++) {
                    *genp++ = IXDR_GET_INT32(buf);
                }
            }
            {
                register int *genp;

                for (i = 0, genp = objp->g;
                    i < 20; i++) {
                    *genp++ = IXDR_GET_INT32(buf);
                }
            }
#else
            {
                register int *genp;

                for (i = 0, genp = objp->f;
                    i < 20; i++) {
                    *genp++ = IXDR_GET_LONG(buf);
                }
            }
            {
                register int *genp;

                for (i = 0, genp = objp->g;
                    i < 20; i++) {
                    *genp++ = IXDR_GET_LONG(buf);
                }
            }
#endif
        }
        return (TRUE);
    }

    if (!xdr_vector(xdrs, (char *)objp->f, 20,
        sizeof (int), (xdrproc_t) xdr_int))
        return (FALSE);
    if (!xdr_vector(xdrs, (char *)objp->g, 20,
        sizeof (int), (xdrproc_t) xdr_int))
        return (FALSE);
    return (TRUE);
}

bool_t
xdr_mlt_out(xdrs, objp)
    register XDR *xdrs;
    mlt_out *objp;
{

#if defined(_LP64) || defined(_KERNEL)
    register int *buf;
#else
    register long *buf;
#endif

    int i;

    if (xdrs->x_op == XDR_ENCODE) {
        buf = XDR_INLINE(xdrs, (40) * BYTES_PER_XDR_UNIT);
        if (buf == NULL) {
            if (!xdr_vector(xdrs, (char *)objp->d, 40,
                sizeof (int), (xdrproc_t) xdr_int))
                return (FALSE);
        } else {
#if defined(_LP64) || defined(_KERNEL)
            {
                register int *genp;

                for (i = 0, genp = objp->d;
                    i < 40; i++) {
                    IXDR_PUT_INT32(buf, *genp++);
                }
            }
#else
            {
                register int *genp;

                for (i = 0, genp = objp->d;
                    i < 40; i++) {
                    IXDR_PUT_LONG(buf, *genp++);
                }
            }
#endif
        }
        return (TRUE);
    } else if (xdrs->x_op == XDR_DECODE) {
        buf = XDR_INLINE(xdrs, (40) * BYTES_PER_XDR_UNIT);
        if (buf == NULL) {
            if (!xdr_vector(xdrs, (char *)objp->d, 40,
                sizeof (int), (xdrproc_t) xdr_int))
                return (FALSE);
        } else {
#if defined(_LP64) || defined(_KERNEL)
            {
                register int *genp;

                for (i = 0, genp = objp->d;
                    i < 40; i++) {
                    *genp++ = IXDR_GET_INT32(buf);
                }
            }
#else
            {
                register int *genp;

                for (i = 0, genp = objp->d;
                    i < 40; i++) {
                    *genp++ = IXDR_GET_LONG(buf);
                }
            }
#endif
        }
        return (TRUE);
    }

    if (!xdr_vector(xdrs, (char *)objp->d, 40,
        sizeof (int), (xdrproc_t) xdr_int))
        return (FALSE);
    return (TRUE);
}



Прочие файлы выше.
PM MAIL   Вверх
xvr
Дата 20.1.2012, 11:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



У вас файл mlt_svc.c обрезан  smile 
Судя по всему в вашем сервере ваша процедура должна называться mltproc_l (а не mltproc_l_svc как у вас, см server.c строка 8)

Цитата(Manaarina @  20.1.2012,  10:55 Найти цитируемый пост)
mlt_svc.c - в этом файле она тоже должна быть, но ее нет.

Она не должна там быть - она должна быть у вас, а этот файл ее будет вызывать

PM MAIL   Вверх
Manaarina
Дата 20.1.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 20.1.2012,  11:56)
У вас файл mlt_svc.c обрезан  smile 
Судя по всему в вашем сервере ваша процедура должна называться mltproc_l (а не mltproc_l_svc как у вас, см server.c строка 8)

Цитата(Manaarina @  20.1.2012,  10:55 Найти цитируемый пост)
mlt_svc.c - в этом файле она тоже должна быть, но ее нет.

Она не должна там быть - она должна быть у вас, а этот файл ее будет вызывать

так хорошо посмотрела сервер - исправила(запомнила если что), но ругается то он по прежнему, на mlt_proc_1 в файле mlt_svc.о. Ругается, опять же  насколько я понимаю на то что функция не объявлена(?) - где-то должно быть это объявление(самой функции).
Кстати наверно я получается не все показала:
вот mlt.h - 25 строка - это объявление? так? mlt.h ко всем этим файлам присоединен(прям там первым файлом), он также сгенерирован rpcgen.
Код

/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */

#ifndef _MLT_H_RPCGEN
#define    _MLT_H_RPCGEN

#include <rpc/rpc.h>

struct mlt_in {
    int f[20];
    int g[20];
};
typedef struct mlt_in mlt_in;

struct mlt_out {
    int d[40];
};
typedef struct mlt_out mlt_out;

#define    MLT_PROG    0x31234567
#define    MLT_VERS    1
#define    MLTPROC    1
extern  mlt_out * mltproc_1();
extern int mlt_prog_1_freeresult();

/* the xdr functions */
extern bool_t xdr_mlt_in();
extern bool_t xdr_mlt_out();

#endif /* !_MLT_H_RPCGEN */


PM MAIL   Вверх
xvr
Дата 20.1.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Manaarina @  20.1.2012,  12:16 Найти цитируемый пост)
вот mlt.h - 25 строка - это объявление?

Это прототип, а реализованна эта функция должна быть в каком то из ваших файлов. Т.е. ее должны написать вы сами (для сервера)

Цитата(Manaarina @  20.1.2012,  12:16 Найти цитируемый пост)
но ругается то он по прежнему, на mlt_proc_1

Так все же mlt_proc_1 или mlt_proc1 или mltproc_1 ?


Это сообщение отредактировал(а) xvr - 20.1.2012, 12:24
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.