Avatar billede don_r Nybegynder
29. november 2004 - 18:55 Der er 4 kommentarer og
1 løsning

Undefined Reference

Hej

Jeg har lavet min egen SOCKETKLASSE INetSocket, i den har jeg funktioner til at f.eks. create,accept,read m.m

#include "INetSocket.h"
#include <iostream>
using namespace std;

INetSocket::INetSocket(){
    connected = false;
    sock = -1;
}

INetSocket::INetSocket(int port){
    connected     = false;
    sock         = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0) {
        throw socketErr(errno);   
    }
    else {
        thisHost.sin_addr.s_addr = htonl(INADDR_ANY);
      }
   
    // For at vi hurtigt kan genbruge socket til den port
    int yes = 1;
      if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
        throw socketErr(errno);
      }
   
    thisHost.sin_family = AF_INET;
      thisHost.sin_port = htons(port);
      acceptPort = port;
      if (bind(sock,(struct sockaddr*)&thisHost,sizeof(thisHost))<0) {
        throw socketErr(errno);
      }   
}

void INetSocket::Create() {
  connected = false;
  sock = socket(PF_INET,SOCK_STREAM,0);
  if (sock < 0) {
    throw socketErr(errno);
  }
}

void INetSocket::Listen(ulong MaxConnections) {
      if (listen(sock,MaxConnections)<0) {
        throw socketErr(errno);
      }   
}

void INetSocket::Accept(INetSocket* newSocket) {
    size_t size = sizeof(struct sockaddr_in);
      struct sockaddr_in tmp;
    int newsock = accept(sock,(struct sockaddr*)&tmp,&size);
      remoteHost = tmp;
      if (newSocket < 0)
        throw socketErr(errno);
      newSocket->sock = newsock;
      newSocket->connected = true;
      newSocket->acceptPort = acceptPort;   
    memcpy(&newSocket->remoteHost,&remoteHost,size);
    // så kan vi måske samle oplysninger om den connected remote host
}

void INetSocket::Connect(const char* host,ushort port) {
      struct hostent* hostinfo;
      remoteHost.sin_family = AF_INET;
      remoteHost.sin_port = htons(port);
      hostinfo = gethostbyname(host);
    if (hostinfo == NULL) {
      throw socketErr(errno);
      }
      remoteHost.sin_addr = *(struct in_addr*)hostinfo->h_addr;
     
      if (connect(sock,(struct sockaddr*)&remoteHost,sizeof(remoteHost))<0) {
        throw socketErr(errno);
      }
      connected = true;
}



int INetSocket::Write(const char* buf, int len) {
  int written = write(sock, buf, len);
  if ( written != len )
    return -1;
  return written;
}

int INetSocket::Read(char* buf,ulong len) {
  return read(sock,buf,len);
}

bool INetSocket::IsConnected() {
  return connected;
}

int INetSocket::GetSocket() {
  return sock;
}

void INetSocket::Shutdown(int action) {
  shutdown(sock,action);
}

void INetSocket::Close() {
  close(sock);
  connected = false;
}

/*int main() {
    INetSocket test(80);
    return 0;   
}*/


Denne main virker hvis den bliver kommenteret "ind". Men hvis jeg laver en anden cpp fil, test.cc som ser sådan ud:

#include "INetSocket.h"

int main() {
    INetSocket test;
    return 1;
}


Den kan godt kompillere med ikke bygge, jeg får følgende fejl.

Bygger fil: test.cc...
g++      "test.cc"    -o "test"
/tmp/ccqobXlR.o(.text+0x18): In function `main':
: udefineret reference til "INetSocket::INetSocket[in-charge]()"
collect2: ld returned 1 exit status
Completed ... unsuccessful
Total time taken: 1 secs
Avatar billede arne_v Ekspert
29. november 2004 - 18:59 #1
g++ test.cc INetSocket.cc -o test

bør virke
Avatar billede arne_v Ekspert
29. november 2004 - 18:59 #2
ligesom

g++ -c test.cc -o test.o
g++ -c INetSocket.cc -o INetSocket.o
g++ test.o INetSocket.o -o test
Avatar billede don_r Nybegynder
30. november 2004 - 19:11 #3
Takker, jeg har dog et til spørgsmål. Det opretter jeg lige i samme kategori

Husk lige at smid et svar
Avatar billede arne_v Ekspert
30. november 2004 - 19:12 #4
svar
Avatar billede arne_v Ekspert
01. januar 2005 - 14:05 #5
Så mangler du bare at acceptere svaret
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester