首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux makeFile的有关问题

2012-03-14 
linux makeFile的问题makefile:#makefile to run TCPEchoClient4.c TCPEchoServer4.c UDPEchoClient.c UDP

linux makeFile的问题
makefile:

#makefile to run TCPEchoClient4.c TCPEchoServer4.c UDPEchoClient.c UDPEchoServer.c
TCPEchoServer4 :TCPEchoServer4.o
gcc -o TCPEchoServer4 TCPEchoServer4.o 
TCPEchoServer4.o:TCPEchoServer4.c 
gcc -c TCPEchoServer4.c 


Practical.h:

#ifndef PRACTICAL_H_
#define PRACTICAL_H_

#include <stdbool.h>
#include <stdio.h>
#include <sys/socket.h>

// Handle error with user msg
void DieWithUserMessage(const char *msg, const char *detail);
// Handle error with sys msg
void DieWithSystemMessage(const char *msg);
// Print socket address
void PrintSocketAddress(const struct sockaddr *address, FILE *stream);
// Test socket address equality
bool SockAddrsEqual(const struct sockaddr *addr1, const struct sockaddr *addr2);
// Create, bind, and listen a new TCP server socket
int SetupTCPServerSocket(const char *service);
// Accept a new TCP connection on a server socket
int AcceptTCPConnection(int servSock);
// Handle new TCP client
void HandleTCPClient(int clntSocket);
// Create and connect a new TCP client socket
int SetupTCPClientSocket(const char *server, const char *service);

enum sizeConstants {
  MAXSTRINGLENGTH = 128,
  BUFSIZE = 512,
};

#endif // PRACTICAL_H_




TCPEchoServer4.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Practical.h"

static const int MAXPENDING = 5; // Maximum outstanding connection requests

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

  if (argc != 2) // Test for correct number of arguments
  DieWithUserMessage("Parameter(s)", "<Server Port>");

  in_port_t servPort = atoi(argv[1]); // First arg: local port

  // Create socket for incoming connections
  int servSock; // Socket descriptor for server
  if ((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  DieWithSystemMessage("socket() failed");

  // Construct local address structure
  struct sockaddr_in servAddr; // Local address
  memset(&servAddr, 0, sizeof(servAddr)); // Zero out structure
  servAddr.sin_family = AF_INET; // IPv4 address family
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY); // Any incoming interface
  servAddr.sin_port = htons(servPort); // Local port

  // Bind to the local address
  if (bind(servSock, (struct sockaddr*) &servAddr, sizeof(servAddr)) < 0)
  DieWithSystemMessage("bind() failed");

  // Mark the socket so it will listen for incoming connections
  if (listen(servSock, MAXPENDING) < 0)
  DieWithSystemMessage("listen() failed");

  for (;;) { // Run forever
  struct sockaddr_in clntAddr; // Client address
  // Set length of client address structure (in-out parameter)
  socklen_t clntAddrLen = sizeof(clntAddr);

  // Wait for a client to connect
  int clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrLen);
  if (clntSock < 0)
  DieWithSystemMessage("accept() failed");

  // clntSock is connected to a client!

  char clntName[INET_ADDRSTRLEN]; // String to contain client address
  if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName,
  sizeof(clntName)) != NULL)
  printf("Handling client %s/%d\n", clntName, ntohs(clntAddr.sin_port));


  else
  puts("Unable to get client address");

  HandleTCPClient(clntSock);
  }
  // NOT REACHED
}


错误:
yangbo@yangbo-desktop:~/test/c$ make
gcc -o TCPEchoServer4 TCPEchoServer4.o 
TCPEchoServer4.o: In function `main':
TCPEchoServer4.c:(.text+0x32): undefined reference to `DieWithUserMessage'
TCPEchoServer4.c:(.text+0x7b): undefined reference to `DieWithSystemMessage'
TCPEchoServer4.c:(.text+0xec): undefined reference to `DieWithSystemMessage'
TCPEchoServer4.c:(.text+0x111): undefined reference to `DieWithSystemMessage'
TCPEchoServer4.c:(.text+0x14c): undefined reference to `DieWithSystemMessage'
TCPEchoServer4.c:(.text+0x1bd): undefined reference to `HandleTCPClient'
collect2: ld returned 1 exit status
make: *** [TCPEchoServer4] 错误 1



[解决办法]
看了下,你TCPEchoServer4.c调用的其它文件中定义的函数,在编译时,再上这个文件试试。
——在楼主位的代码中,找不到那些出错函数的定义啊。
[解决办法]
找不到符号,这是link出错。
gcc -o TCPEchoServer4 TCPEchoServer4.o
需要改为
gcc -o TCPEchoServer4 TCPEchoServer4.o DieWithMessage.o xx1.o xxx.o 
所有需要的.o 文件在link时都要在
[解决办法]
// Handle error with user msg
void DieWithUserMessage(const char *msg, const char *detail);
// Handle error with sys msg
void DieWithSystemMessage(const char *msg);
// Print socket address
void PrintSocketAddress(const struct sockaddr *address, FILE *stream);
// Test socket address equality
bool SockAddrsEqual(const struct sockaddr *addr1, const struct sockaddr *addr2);
// Create, bind, and listen a new TCP server socket
int SetupTCPServerSocket(const char *service);
// Accept a new TCP connection on a server socket
int AcceptTCPConnection(int servSock);
// Handle new TCP client
void HandleTCPClient(int clntSocket);
// Create and connect a new TCP client socket
int SetupTCPClientSocket(const char *server, const char *service);

你的这些函数只是声明了,而没有定义。你要有这些函数的具体实现方法。
下面是一些函数的实现:
void DieWithUserMessage(const char *msg, const char *detail)
{
fputs(msg, stderr);
fputs(": ", stderr);
fputs(detial, stderr);
fputc('\n', stderr);
exit(1);
}
// Handle error with sys msg
void DieWithSystemMessage(const char *msg)
{
perror(msg);
exit(1);
}

// Print socket address
void PrintSocketAddress(const struct sockaddr *address, FILE *stream)
{
if (address == NULL || stream == NULL)
return;

void *numericAddress; // Pointer to binary address
// Buffer to contain result (IPv6 sufficient to hold IPv4)
char addrBuffer[INET6_ADDRSTRLEN];
in_port_t port; // Port to print
// Set pointer to address based on address family
switch (address->sa_family) {
case AF_INET:
numericAddress = &((struct sockaddr_in *) address)->sin_addr;
port = ntohs(((struct sockaddr_in *) address)->sin_port);
break;
case AF_INET6:
numericAddress = &((struct sockaddr_in6 *) address)->sin6_addr;
port = ntohs(((struct sockaddr_in6 *) address)->sin6_port);
break;
default:
fputs("[unknown type]", stream); // Unhandled type
return;
}
// Convert binary to printable address
if (inet_ntop(address->sa_family, numericAddress, addrBuffer,
sizeof(addrBuffer)) == NULL)
fputs("[invalid address]", stream); // Unable to convert
else {
fprintf(stream, "%s", addrBuffer);
if (port != 0) // Zero not valid in any socket addr
fprintf(stream, "-%u", port);


}
}

// Test socket address equality
bool SockAddrsEqual(const struct sockaddr *addr1, const struct sockaddr *addr2)
{
if (addr1 == NULL || addr2 == NULL)
return addr1 == addr2;
else if (addr1->sa_family != addr2->sa_family)
return false;
else if (addr1->sa_family == AF_INET) {
struct sockaddr_in *ipv4Addr1 = (struct sockaddr_in *) addr1;
struct sockaddr_in *ipv4Addr2 = (struct sockaddr_in *) addr2;
return ipv4Addr1->sin_addr.s_addr == ipv4Addr2->sin_addr.s_addr
&& ipv4Addr1->sin_port == ipv4Addr2->sin_port;
} else if (addr1->sa_family == AF_INET6) {
struct sockaddr_in6 *ipv6Addr1 = (struct sockaddr_in6 *) addr1;
struct sockaddr_in6 *ipv6Addr2 = (struct sockaddr_in6 *) addr2;
return memcmp(&ipv6Addr1->sin6_addr, &ipv6Addr2->sin6_addr,
sizeof(struct in6_addr)) == 0 && ipv6Addr1->sin6_port
== ipv6Addr2->sin6_port;
} else
return false;
}


enum sizeConstants {
MAXSTRINGLENGTH = 128,
BUFSIZE = 5120,
};

热点排行