2017-08-27 4 views
0

OKは、私がコンパイルしようとしているコードです:どのようにGCCディレクトリの検索パスを変更するのですか?ので、ここで

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <time.h> 
#include <netdb.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <net/sctp.h> 


#define MAX_BUFFER 1024 

void die(char *s) 
{ 
     perror(s); 
     exit(1); 
} 


int main(int argc, char **argv) 
{ 

    int connector,flags,r; 
    u_int port; 
    struct hostent*  host; 
    struct in_addr   in; 
    struct sockaddr_in  rmaddr; 
    struct sctp_initmsg initmsg; 
    struct sctp_sndrcvinfo sinfo; 
    struct sctp_event_subscribe events; 
    bool connected = false; 
    char buffer[MAX_BUFFER]; 
    char* exit = "quit"; 

    if(argc!=2) { 
     printf("Usage: %s ipaddress\n", argv[0]); 
    return -1; 
    } 



    if((connector = socket(AF_INET,SOCK_STREAM, IPPROTO_SCTP))<0){ 
     perror("socket"); 
     return -1; 
    } 



    printf("Enter the port number you wish to connect(on): "); 
    scanf("%u", &port); 
    printf("\n"); 

    if(port==0){ 
       printf("ERR0R: Port number must be between 1 & 65,535\n"); 
       printf("\n"); 
       printf("Enter the port number you wish to connect(on): "); 
       scanf("%u", &port); 
       printf("\n");   
    } 


    memset(&initmsg, 0, sizeof(initmsg)); 
    initmsg.sinit_num_ostreams = 3; 
    initmsg.sinit_max_instreams = 3; 
    initmsg.sinit_max_attempts = 2; 
    if(setsockopt(connector,IPPROTO_SCTP,SCTP_INITMSG,&initmsg,sizeof(initmsg))<0){ 
     perror("setsockopt"); 
     return -1; 
    } 

    bzero((void *)&rmaddr, sizeof(rmaddr)); 
    rmaddr.sin_family = AF_INET; 
    inet_pton(AF_INET, argv[1], &rmaddr.sin_addr); 
    rmaddr.sin_port = htons(port); 



    connect(connector,(struct sockaddr*)&rmaddr,sizeof(rmaddr)); 

     connected=true; 
     memset((void *)&events, 0, sizeof(events)); 
     events.sctp_data_io_event = 1; 
     setsockopt(connector, SOL_SCTP, SCTP_EVENTS,(const void *)&events, sizeof(events)); 
     printf("\n"); 
     printf("Connected to host: %s",argv[1],"on port %u",port); 
     printf("  type 'quit' to disconnect\n"); 
     printf("\n"); 



    while(connected==true){ 

     int nbs; 
     int nbr = 0; 
     int flags = MSG_NOSIGNAL; 
     printf(">"); 
     scanf("%s",buffer); 
     printf("\n"); 

     sinfo.sinfo_flags = flags; 

     nbs = send(connector,(void*)&buffer,sizeof(buffer),flags);   



     printf("\n"); 
     printf("# bytes sent %i\n", nbs); 
     printf("\n"); 

     if(nbs<0){ 
     perror("sendmsg"); 
      close(connector); 
      return -1; 
     } 

     while(nbr < nbs){ 
     socklen_t len = sizeof(rmaddr); 
     nbr = recv(connector,(void*)&buffer,sizeof(buffer),flags); 


     if(nbr<0){ 
       perror("recvmsg"); 
       close(connector); 
       return -1; 
     }else{ 
      printf(">>"); 
       printf("%s\n",buffer); 
       printf("\n"); 
     } 

     } 

    } 

}

そして、私は、コマンド "GCCのsctp_ec.c" を入力したときに、私は次の出力を得る:

-*- mode: compilation; default-directory: "/usr/lib/gcc/x86_64-linux-gnu/4.8.4/include/" -*- 
Compilation started at Sun Aug 27 12:43:50 

gcc sctp_ec.c 
In file included from sctp_ec.c:10:0: 
/usr/include/net/sctp.h:55:22: fatal error: net/ipv6.h: No such file or directory 
compilation terminated. 

Compilation exited abnormally with code 1 at Sun Aug 27 12:43:50 

私は問題が何であるか知っています。 GCCコンパイラが間違ったディレクトリで検索しています!パス内のファイルを検索する:/usr/lib/gcc/x86_64-linux-gnu/4.8.4/include(/ usr/includeのかわりに) -I、-Idir、および-isystemコマンドを使用してみましたが、役に立たなかった。 -isystemを使用すると、これらのパスの両方を検索し、定義の競合が発生します。では、GCC/emacs24プログラムを永久に変更して、のみを.cコードファイルの最初のパスで検索するにはどうすればいいですか?

FTR Linux Mint 18.1でemacs24とGCCを実行しています。

答えて

0

環境変数C_INCLUDE_PATHを検索パス上で必要なディレクトリのリストに設定すると、永続的になります(シェルに応じて.profileまたは.loginファイルに設定します)。値は、検索するディレクトリのコロン区切りのリストでなければなりません。

+0

.profileファイルまたは.loginファイルにどのように設定しますか?これは私が探しているもののように聞こえる。 – SavedbyZer0

+0

テキストエディタ(viまたはemacsはUnixシステムでは典型的なものです)を使用するだけです。あなたがラインに '輸出C_INCLUDE_PATHを追加したいので、あなたはおそらく=、シェルのためのbashを使う "/パス/に/ DIR1:/パス//dir2をする:別/ DIR /"' は、次にコマンドを実行します '%。 〜/ .profile' (これは '。'です)、現在のシェルで有効になります。それはあなたが始めるすべての将来のシェルで自動的に起こります – Jabberwock

1

は、これらのコマンドラインオプションのいずれかを使用します。

> -I dir 
> -iquote dir 
> -isystem dir 
> -idirafter dir 

あなたが本当に-nostdincおよび/または-isystemオプションを使用して、システムディレクトリの検索順序を変更する必要がある場合。

+0

2つのオプションがあります:メークファイルまたはそれを作成するものです。私は個人的にEclipseを好む。私はemacsを使用しないので何も助言しません。 –

関連する問題