2015-04-14 53 views
0

我第一次在C中使用gssapi。我正在尝试重新构建Oracle doc http://docs.oracle.com/cd/E19683-01/816-1331/sampleprogs-1/index.html上的示例。 在我的.c文件中,我打电话给gss_str_to_oid(&min_stat, &tok, oid);,并得到一个未定义的引用错误。我在我的.c文件的顶部包含#include "gssapi.h"。在gssapi.h中有函数调用不知道为什么我得到一个undessine拒绝gss_str_to_oid错误

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,并且从我的makefile中的所有目标下面的内容中看到: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,等,你需要添加到您的项目?如果没有makefile或您的项目设置显示在您的问题;我想你不会收到非常明确的答案。只包括头文件是不够的,未定义不是编译错误,而是链接器错误,这意味着它缺少一个引用,因为你没有将库链接到你的程序。

+0

我已经在eclipse中编写过c程序,并且从未有过这个问题或者不得不写一个make。为什么我必须在这里? – Aaron

+0

你从不犯错误并不意味着你在将来不会犯错。如果有一个附带这些标题的库将它包含在您的项目中,或者未定义的引用永远不会消失。恐怕这是唯一的方法。除非你有链接图书馆。如果我不清楚,我可以给你一个关于如何在eclipse中这样做的具体说明。 –

+0

在ecslipse的makefile文件中做什么的链接会很好。我知道eclipse为你创建一个makefile,我认为它会自动链接这些文件。但我想我错了 – Aaron

相关问题