티스토리 뷰

728x90
반응형

 

 

 

 

운영체제 : Windows 10 (64bit)

작업환경 : VSCode, MinGW, gcc/g++ version 6.3.0

오류 내용 : 

> Executing task: gcc c:\HelloWorld.c -o c:\HelloWorld <

C:\HelloWorld.o:HelloWorld.c:(.text+0x37): undefined reference to `WSAStartup@8'     
C:\HelloWorld.o:HelloWorld.c:(.text+0x43): undefined reference to `WSAGetLastError@0'
C:\HelloWorld.o:HelloWorld.c:(.text+0x85): undefined reference to `socket@12'        
C:\HelloWorld.o:HelloWorld.c:(.text+0x96): undefined reference to `WSAGetLastError@0'
C:\HelloWorld.o:HelloWorld.c:(.text+0xd1): undefined reference to `htons@4'
C:\HelloWorld.o:HelloWorld.c:(.text+0xf8): undefined reference to `bind@12'
C:\HelloWorld.o:HelloWorld.c:(.text+0x105): undefined reference to `WSAGetLastError@0'
C:\HelloWorld.o:HelloWorld.c:(.text+0x134): undefined reference to `listen@8'
C:\HelloWorld.o:HelloWorld.c:(.text+0x16c): undefined reference to `accept@12'        
C:\HelloWorld.o:HelloWorld.c:(.text+0x17d): undefined reference to `WSAGetLastError@0'
C:\HelloWorld.o:HelloWorld.c:(.text+0x1a4): undefined reference to `closesocket@4'
C:\HelloWorld.o:HelloWorld.c:(.text+0x1ac): undefined reference to `WSACleanup@0' 
collect2.exe: error: ld returned 1 exit status
터미널 프로세스 "C:\Windows\System32\cmd.exe /d /c gcc c:\HelloWorld.c -o c:\HelloWorld"이(가) 종료되었습니다(종료 코드: 1).

터미널이 작업에서 다시 사용됩니다. 닫으려면 아무 키나 누르세요.

작업 코드 : 작업 코드는 다음 링크에서 참고하였습니다. Winsock tutorial 사이트로써 많은 도움이 되었습니다.

https://www.binarytides.com/winsock-socket-programming-tutorial/

/*
	Bind socket to port 9090 on localhost
*/
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib") //Winsock Library

int main(int argc, char *argv[])
{
	WSADATA wsa;
	SOCKET s, new_socket;
	struct sockaddr_in server, client;
	int c;

	printf("\nInitialising Winsock...");
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
	{
		printf("Failed. Error Code : %d", WSAGetLastError());
		return 1;
	}

	printf("Initialised.\n");

	//Create a socket
	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
	{
		printf("Could not create socket : %d", WSAGetLastError());
	}

	printf("Socket created.\n");

	//Prepare the sockaddr_in structure
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = INADDR_ANY;
	server.sin_port = htons(9090);

	//Bind
	if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
	{
		printf("Bind failed with error code : %d", WSAGetLastError());
	}

	puts("Bind done");

	//Listen to incoming connections
	listen(s, 3);

	//Accept and incoming connection
	puts("Waiting for incoming connections...");

	c = sizeof(struct sockaddr_in);
	new_socket = accept(s, (struct sockaddr *)&client, &c);
	if (new_socket == INVALID_SOCKET)
	{
		printf("accept failed with error code : %d", WSAGetLastError());
	}

	puts("Connection accepted");

	closesocket(s);
	WSACleanup();

	return 0;
}

 

해결 방법 : gcc 또는 g++ 을 이용한 컴파일 시 아래 명령처럼 ws2_32 라이브러리를 직접 링킹 하면 됩니다.

C:\> gcc -o HelloWorld.exe HelloWorld.c -lw2_32 -Wall

-l 옵션은 링크할 라이브러리 이름을 입력하는 옵션입니다.

-Wall 옵션은 컴파일 시 존재하는 모든 경고 메시지를 출력하라는 기능을 합니다.

-o 옵션은 소스파일(HelloWorld.c)를 빌드하고 그 결과물(HelloWorld.exe)를 만드는 기능을 합니다.

 

컴파일 결과 : 아래와 같이 나오며, 실행파일인 HelloWorld.exe 가 잘 만들어지는 걸 확인할 수 있습니다.

C:\>gcc -o HelloWorld.exe HelloWorld.c -lws2_32 -Wall
HelloWorld.c:7:0: warning: ignoring #pragma comment  [-Wunknown-pragmas]
 #pragma comment(lib, "ws2_32.lib") //Winsock Library
C:\>dir || findstr HelloWorld
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 6AF2-A834

 C:\ 디렉터리

2021-05-20  오전 11:14    <DIR>          .
2021-05-20  오전 11:14    <DIR>          ..
2021-05-20  오전 10:46             1,406 HelloWorld.c
2021-05-20  오전 11:14            42,893 HelloWorld.exe
               2개 파일              44,299 바이트
               2개 디렉터리  161,169,846,272 바이트 남음

 

실행 결과 : 아래와 같이 소켓 프로그래밍 한 프로그램이 잘 실행되는 걸 확인할 수 있습니다.

C:\>HelloWorld.exe

Initialising Winsock...Initialised.
Socket created.
Bind done
Waiting for incoming connections...

 

- 끝 -

728x90
반응형
댓글