コンパイルエラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ファイブマン

コンパイルエラー

#1

投稿記事 by ファイブマン » 14年前

コンパイルエラー
Linux系OSを使って,C言語でネットワークプログラミングに取り組んでいます.
以下のプログラムをsolaris上で
%gcc -lnsl -lsocket -lresolv -o echo_server echo_server.c
と,コンパイルしたのですが,

未定義の 最初に参照している
シンボル ファイル
Readline /var/tmp//ccyx9O2s.o
ld: 重大なエラー: シンボル参照エラー。echo_server に書き込まれる出力はありません。
collect2: ld はステータス 1 で終了しました

と出てしまい,うまく通りません.
何か他のオプションをつけてコンパイルしなければならないのでしょうか.

コード:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#include <unistd.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <netinet/in.h>

#define ERR -1
#define PORT 50000
#define BUFSIZE 1024

void usage(void);
char *command_name;

int socket(int domain, int type, int protocol);
int ReadLine(int sd, char *buf);
int WriteLine(int sd, char *buf);

int main(int argc, char* argv[]){
  int sds;                 //ソケットディスクリプタ
  int sda;                 // 
  struct sockaddr_in server; //サーバプロセスのソケットアドレス情報 
struct sockaddr_in client; //サーバプロセスのソケットアドレス情報
 int fromlen;
 int ret;
  struct hostent *hp; //ホスト情報
  char buf[BUFSIZE];
  int temp = 1;
  int i;


if ((command_name = rindex(argv[0], '/')) !=NULL)
    command_name++;
  else
    command_name = argv[0];
  
  if(argc != 2)
    usage();
  /* ソケットの作成 */
  if ( (sds = socket(PF_INET, SOCK_STREAM, 0)) == ERR) {
    perror("server: socket");
    exit(1);
  }
 
 /* ソケットオプションの設定 */
  if (setsockopt(sds, SOL_SOCKET, SO_REUSEADDR, (void *)&temp, sizeof(temp))){
    perror("server:setsockopt");
    exit(1);
  }
  
  /* サーバプロセスのソケットアドレス情報の設定 */
  memset((void*)&server, 0, sizeof(server));
  server.sin_family = PF_INET;
  server.sin_port = htons(PORT);
  server.sin_addr.s_addr = htonl(INADDR_ANY);
  
/* ソケットにアドレスをバインド */
  if(bind(sds, (struct sockaddr *)&server, sizeof(server)) == ERR) {
    perror("server: bind");
    exit(1);
  } 
  
/* 接続要求の受け入れ準備 */
/* バインドされたソケットを待機状態に */
  if(listen(sds, 5) == ERR) {
    perror("server: listen");
  exit(1);
  }
  
  
  memset((void *)&client, 0, sizeof(client));
  fromlen = sizeof(client);
/* クライアントからの接続要求を受け入れ,通信回路を確保する */
/* クライアントと接続したソケットの識別子がsdaに格納される   */
  if ( (sda = accept(sds, (struct sockaddr *)&client, &fromlen))
       == ERR ){
    perror("server: accept");
    exit(1);
  }
  
  close(sds);/* sds は必要なくなったので閉じる*/

  /* クライアントと接続されているソケットからのデータ受信*/
  do {
    memset(buf, '\0', BUFSIZE);
    
    ret = Readline(sda, buf);
    for ( i=0; i<ret; i++){
      if (isalpha(buf[i]))
	buf[i] = toupper(buf[i]);
    }
    WriteLine(sda, buf);
  } while(1);
  
  close(sda);
  
  return 0;
}

void usage(void)
{
  fprintf(stderr, "Usage: %s\n", command_name);
  exit(1);
}

int ReadLine(int sd, char *buf)
{
  int i = 0;
  unsigned char ch;

  while (read(sd, &ch, 1) == 1){
    buf[i++] = ch;
    if ( i > BUFSIZE-1 ) return -1;
    if (ch == '\n' ){
      buf[i] = '\0';
      return i;
    }
  }
  buf[i] = '\0';
  return -1;
}

int WriteLine(int sd, char *buf)
{
  int a;

  a = write(sd, buf, strlen(buf));

  return a;
}

かずま

Re: コンパイルエラー

#2

投稿記事 by かずま » 14年前

ファイブマン さんが書きました: 未定義の        最初に参照している
シンボル        ファイル
Readline        /var/tmp//ccyx9O2s.o
ld: 重大なエラー: シンボル参照エラー。echo_server に書き込まれる出力はありません。
collect2: ld はステータス 1 で終了しました

と出てしまい,うまく通りません.
何か他のオプションをつけてコンパイルしなければならないのでしょうか.
ソース中で定義されているのは ReadLine ですから、Readline は未定義のシンボルです。

ファイブマン

Re: コンパイルエラー

#3

投稿記事 by ファイブマン » 14年前

こんな恥ずかしくて単純なミスをw
ありがとうございました.

閉鎖

“C言語何でも質問掲示板” へ戻る