2015-04-14 7 views
0

Я использую gssapi в C в первый раз. Я пытаюсь восстановить пример на Oracle doc http://docs.oracle.com/cd/E19683-01/816-1331/sampleprogs-1/index.html. В моем .c файле я вызываю gss_str_to_oid(&min_stat, &tok, oid); и получаю неопределенную ошибку ссылки. Я включил #include "gssapi.h" в начало моего .c файла. В gssapi.h есть вызов функцииНе знаю, почему я получаю неопределенное подтверждение gss_str_to_oid error

OM_uint32 KRB5_CALLCONV 
gss_str_to_oid(
    OM_uint32 *,  /* minor_status */ 
    gss_buffer_t,  /* oid_str */ 
    gss_OID *); 

Так что я делаю неправильно? Я думал, что если вы включили #include "gssapi.h", это даст мне доступ к функции в gssapi. Оба файла находятся в моей папке src. Так что я делаю неправильно. Я использую eclipse и из того, что в моем make-файле под целями он говорит все: GSS-API. Я включаю большую часть своего кода ниже.

главный

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <error.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

#include "gssapi.h" 
#include "gssapi_ext.h" 
#include "gss-misc.h" 

/* global mech oid needed by display status, and acquire cred */ 
FILE *display_file; 
gss_OID g_mechOid = GSS_C_NULL_OID; 


void usage() 
{ 
    fprintf(stderr, "Usage: gss-client [-port port] [-d]" 
         " [-mech mechOid] host service msg\n"); 
    exit(1); 
} 

static void parse_oid(char *mechanism, gss_OID *oid) 
{ 
    char  *mechstr = 0, *cp; 
    gss_buffer_desc tok; 
    OM_uint32 maj_stat, min_stat; 

    if (isdigit(mechanism[0])) { 
     mechstr = malloc(strlen(mechanism)+5); 
     if (!mechstr) { 
      printf("Couldn't allocate mechanism scratch!\n"); 
      return; 
     } 
     sprintf(mechstr, "{ %s }", mechanism); 
     for (cp = mechstr; *cp; cp++) 
      if (*cp == '.') 
       *cp = ' '; 
     tok.value = mechstr; 
    } else 
     tok.value = mechanism; 
    tok.length = strlen(tok.value); 
     maj_stat = gss_str_to_oid(&min_stat, &tok, oid); 
    if (maj_stat != GSS_S_COMPLETE) { 
//  display_status("str_to_oid", maj_stat, min_stat); 
     return; 
    } 
    if (mechstr) 
     free(mechstr); 
} 

int main(argc, argv) 
    int argc; 
    char **argv; 
{ 
    /* char *service_name, *hostname, *msg; */ 
    char *msg; 
    char service_name[128]; 
    char hostname[128]; 
    char *mechanism = 0; 
    u_short port = 4444; 
    int use_file = 0; 
    OM_uint32 deleg_flag = 0, min_stat; 

    display_file = stdout; 

    /* Parse arguments. */ 

    argc--; argv++; 
    while (argc) { 
      if (strcmp(*argv, "-port") == 0) { 
       argc--; argv++; 
       if (!argc) usage(); 
       port = atoi(*argv); 
      } else if (strcmp(*argv, "-mech") == 0) { 
       argc--; argv++; 
       if (!argc) usage(); 
       mechanism = *argv; 
      } else if (strcmp(*argv, "-d") == 0) { 
       deleg_flag = GSS_C_DELEG_FLAG; 
      } else if (strcmp(*argv, "-f") == 0) { 
       use_file = 1; 
      } else 
       break; 
      argc--; argv++; 
    } 
    if (argc != 3) 
      usage(); 

    if (argc > 1) { 
       strcpy(hostname, argv[0]); 
     } else if (gethostname(hostname, sizeof(hostname)) == -1) { 
         perror("gethostname"); 
         exit(1); 
     } 


    if (argc > 2) { 
     strcpy(service_name, argv[1]); 
     strcat(service_name, "@"); 
     strcat(service_name, hostname); 

    } 

     msg = argv[2]; 

    if (mechanism) 
     parse_oid(mechanism, &g_mechOid); 

/*  if (call_server(hostname, port, g_mechOid, service_name, 
        deleg_flag, msg, use_file) < 0) 
      exit(1);*/ 

/* 
    if (g_mechOid != GSS_C_NULL_OID) 
     (void) gss_release_oid(&min_stat, &gmechOid); 
*/ 

    return 0; 
} 

gssapi.h

/* New for V2 */ 
OM_uint32 KRB5_CALLCONV 
gss_str_to_oid(
    OM_uint32 *,  /* minor_status */ 
    gss_buffer_t,  /* oid_str */ 
    gss_OID *); 

ответ

1

Вы просто не может включать в себя заголовок, вы должны связать библиотеку либо динамически или статически. Есть ли какая-нибудь dll, lib, и т. Д., Которую вы должны добавить в свой проект? Без make-файла или настройки вашего проекта было показано в вашем вопросе; Я думаю, вы не получите очень четкого ответа. Просто указать заголовочный файл недостаточно, undefined - это не ошибка компиляции, а ошибка компоновщика, что означает отсутствие ссылки, потому что вы не связываете библиотеку с вашей программой.

+0

Я написал программы c в затмении раньше и никогда не имел этой проблемы или должен был написать make. Зачем мне здесь? – Aaron

+0

Вы никогда не ошибетесь, это не значит, что вы не можете совершить ошибку в будущем. Если в вашем проекте есть библиотека, входящая в состав этих заголовков, либо неопределенные ссылки никогда не исчезнут. Я боюсь, что это единственный способ. Если вы не связали библиотеку. Если я не понимаю, я могу дать вам конкретную инструкцию о том, как это сделать в eclipse. –

+0

Ссылка была бы отличной в том, что делать с makefile в ecslipse. Я знаю, что eclipse создает для вас файл makefile, я думал, что он автоматически связывает файлы. Но я думаю, что я ошибаюсь – Aaron