/x86_64-linux-gnu/Scrt1.o:在函数_start中:(.text + 0x20):对main的未定义引用

时间:2020-04-19 17:52:28

标签: c unistd.h gcc4.7

..当我跑步时:

gcc -o服务器-lpthread服务器.c

发生错误。 和:

gcc -o client -lpthread client.c

再次出现相同的错误。

我正在编写一个基于TCP的聊天室程序。

有server.c:

let frame = document.createElement('iframe');
//hide the iframe
frame.style.display = 'none'; 

//Must add iframe to DOM, otherwise contentWindow would be null. 
document.body.appendChild(frame);

//lose built in fetch
fetch = () =>{};

//retrieve fetch from contentWindow property
window.fetch = frame.contentWindow.fetch;

//use fetch
fetch('http://example.com/movies.json')
  .then(res=>res.json())
  .then(json=>console.log(json))
  .catch(err=>console.log('Error!'));

我真的不知道发生了什么。

这么长时间困扰我!!!请救救我!

2 个答案:

答案 0 :(得分:0)

Order matters,使用

gcc -o server server.c -lpthread

答案 1 :(得分:0)

我找到了解决该问题的方法,这似乎是由于代码规范所致。当我在所有定义的函数(当然包括主函数)之间添加空白行时,我认为这应该是解决问题的关键。帮助gcc找到main函数的确切定义),然后再次编译链接。 新版本的server.c(只需添加空白行):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>

int sockfd;//服务器socket
int fds[100];//客户端的socketfd,100个元素,fds[0]~fds[99]
int size =100 ;//用来控制进入聊天室的人数为100以内
char* IP = "192.168.255.255";
short PORT = 8000;
typedef struct sockaddr SA;

int pthread_create(
                 pthread_t *restrict tidp,   //新创建的线程ID指向的内存单元。
                 const pthread_attr_t *restrict attr,  //线程属性,默认为NULL
                 void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行
                 void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。
                  );

void init(){
    sockfd = socket(PF_INET,SOCK_STREAM,0);
    if (sockfd == -1){
        perror("创建socket失败");
        exit(-1);
    }
    struct sockaddr_in addr;
    addr.sin_family = PF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr = inet_addr(IP);
    if (bind(sockfd,(SA*)&addr,sizeof(addr)) == -1){
        perror("绑定失败");
        exit(-1);
    }
    if (listen(sockfd,100) == -1){
        perror("设置监听失败");
        exit(-1);
    }
}

void SendMsgToAll(char* msg){
    int i;
    for (i = 0;i < size;i++){
        if (fds[i] != 0){
            printf("sendto%d\n",fds[i]);
            send(fds[i],msg,strlen(msg),0);
        }
    }
}

void* service_thread(void* p){
    int fd = *(int*)p;
    printf("pthread = %d\n",fd);
    while(1){
        char buf[100] = {};
        if (recv(fd,buf,sizeof(buf),0) <= 0){//阻塞与非阻塞recv返回值没有区分,都是 <0 出错 =0 连接关闭 >0 接收到数据大小
            int i;
            for (i = 0;i < size;i++){
                if (fd == fds[i]){//遍历寻找那个关闭的连接
                    fds[i] = 0;
                    break;
                }
            }
                printf("退出:fd = %dquit\n",fd);
                pthread_exit((void*)&i);
        }
        //把服务器接受到的信息发给所有的客户端
        SendMsgToAll(buf);
    }
}

void service(){
    printf("服务器启动\n");
    while(1){
        struct sockaddr_in fromaddr;
        socklen_t len = sizeof(fromaddr);
        int fd = accept(sockfd,(SA*)&fromaddr,&len);
        if (fd == -1){
            printf("客户端连接出错...\n");
            continue;
        }
        int i = 0;
        for (i = 0;i < size;i++){
            if (fds[i] == 0){
                //记录客户端的socket
                fds[i] = fd;
                printf("fd = %d\n",fd);
                //有客户端连接之后,启动线程给此客户服务
                pthread_t tid;
                pthread_create(&tid,0,service_thread,&fd);
                break;
            }
        if (size == i){
            //发送给客户端说聊天室满了
            char* str = "对不起,聊天室已经满了!";
            send(fd,str,strlen(str),0); 
            close(fd);
        }
        }
    }
}

int main(){
    init();
    service();
    return 0;
}

然后:

gcc -o server server.c -plthread

它可以工作。 顺便说一句,我使用vscode添加一个新的.c文件。添加空白行后,.c文件将被识别为C文件。它的图标上带有一个巨大的C,之后又添加了空行。 just like this