2015-09-25 63 views
-1

我從here 拿起一個IRC bot的骨架,它不會編譯,但筆者認爲它應該做的。 GCC基本上拋出了這些錯誤IRC bot的C語言編寫的

/tmp/cc39tOaX.o: In function raw': bot.c:(.text+0x73): undefined reference to va_start' bot.c:(.text+0xaa): undefined reference to `va_end' collect2: error: ld returned 1 exit status

這似乎意味着沒有定義這兩個功能在它們的原始功能被稱爲前?

無論如何,這裏是代碼。開始使用它的任何幫助都是非常有幫助的。

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <netdb.h> 

int conn; 
char sbuf[512]; 

void raw(char *fmt, ...) { 
va_list ap; 
va_start(ap, fmt); 
vsnprintf(sbuf, 512, fmt, ap); 
va_end(ap); 
printf("<< %s", sbuf); 
write(conn, sbuf, strlen(sbuf)); 
} 

int main() { 

char *nick = "test"; 
char *channel = NULL; 
char *host = "irc.dav7.net"; 
char *port = "6667"; 

char *user, *command, *where, *message, *sep, *target; 
int i, j, l, sl, o = -1, start, wordcount; 
char buf[513]; 
struct addrinfo hints, *res; 

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 
getaddrinfo(host, port, &hints, &res); 
conn = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 
connect(conn, res->ai_addr, res->ai_addrlen); 

raw("USER %s 0 0 :%s\r\n", nick, nick); 
raw("NICK %s\r\n", nick); 

while ((sl = read(conn, sbuf, 512))) { 
    for (i = 0; i < sl; i++) { 
     o++; 
     buf[o] = sbuf[i]; 
     if ((i > 0 && sbuf[i] == '\n' && sbuf[i - 1] == '\r') || o == 512) { 
      buf[o + 1] = '\0'; 
      l = o; 
      o = -1; 

      printf(">> %s", buf); 

      if (!strncmp(buf, "PING", 4)) { 
       buf[1] = 'O'; 
       raw(buf); 
      } else if (buf[0] == ':') { 
       wordcount = 0; 
       user = command = where = message = NULL; 
       for (j = 1; j < l; j++) { 
        if (buf[j] == ' ') { 
         buf[j] = '\0'; 
         wordcount++; 
         switch(wordcount) { 
          case 1: user = buf + 1; break; 
          case 2: command = buf + start; break; 
          case 3: where = buf + start; break; 
         } 
         if (j == l - 1) continue; 
         start = j + 1; 
        } else if (buf[j] == ':' && wordcount == 3) { 
         if (j < l - 1) message = buf + j + 1; 
         break; 
        } 
       } 

       if (wordcount < 2) continue; 

       if (!strncmp(command, "001", 3) && channel != NULL) { 
        raw("JOIN %s\r\n", channel); 
       } else if (!strncmp(command, "PRIVMSG", 7) || !strncmp(command, "NOTICE", 6)) { 
        if (where == NULL || message == NULL) continue; 
        if ((sep = strchr(user, '!')) != NULL) user[sep - user] = '\0'; 
        if (where[0] == '#' || where[0] == '&' || where[0] == '+' || where[0] == '!') target = where; else target = user; 
        printf("[from: %s] [reply-with: %s] [where: %s] [reply-to: %s] %s", user, command, where, target, message); 
        //raw("%s %s :%s", command, target, message); // If you enable this the IRCd will get its "*** Looking up your hostname..." messages thrown back at it but it works... 
       } 
      } 

     } 
    } 

} 

return 0; 

} 

我試着

void va_start(); 
void va_end(); 

定義函數原始(之前的va_start和va_end用來),但是這並沒有改變什麼..

+0

只是要清楚:你寫的不是定義,而是(各種)聲明。 –

回答

3
man va_start 

給我說:

SYNOPSIS 
     #include <stdarg.h> 

     void va_start(va_list ap, last); 
     type va_arg(va_list ap, type); 
     void va_end(va_list ap); 
     void va_copy(va_list dest, va_list src); 

通過將#include <stdarg.h>爲我工作。

+0

感謝這工作,我不知道va_start /結束已經預定義。 – fscked