PDA

View Full Version : Simple client-type code compiles in ubuntu, but not in osx




tjw09003
Oct 6, 2010, 08:13 PM
This will compile in ubuntu but not osx, gcc output is at the bottom of the post. This code is a monster of copied and pasted code from tutorials, but it does compile in ubuntu :)


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

void sendMessagedd(char* test);

void sendMessagedd(char * test){
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;

char buffer[256];
/*if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}*/
portno = atoi("60000");
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname("localhost");
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);

if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");

//printf("Please enter the message: ");
bzero(buffer,256);
//fgets(buffer,255,stdin);
n = write(sockfd,test,strlen(test));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,256);

n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);/**/
close(sockfd);


}

int main(void)
{
sendMessagedd("Hello World");

return 0;
}



gcc output


gcc client.c -o client
client.c: In function ‘sendMessagedd’:
client.c:37: warning: passing argument 2 of ‘connect’ from incompatible pointer type
Undefined symbols:
"_error", referenced from:
_sendMessagedd in cc2nPdDt.o
_sendMessagedd in cc2nPdDt.o
_sendMessagedd in cc2nPdDt.o
_sendMessagedd in cc2nPdDt.o
ld: symbol(s) not found
collect2: ld returned 1 exit status



takemore
Oct 6, 2010, 09:31 PM
It's not a compilation error. It's a linker error. The symbol _error cannot be found.

I am not sure where is that symbol on Mac OS X is. To overcome it you could add a line at the beginning of the file (preferably after #include directives):

#define error printf

That will use printf instead of error. This way an executable file will be produced though you need to keep in mind that printf will print error messages to the standard console while error would print to error console. It may matter if you are going to run it in background. I am not an expert here though.

tjw09003
Oct 6, 2010, 09:35 PM
thanks that worked