티스토리 뷰
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
반응형
'프로그래밍 > C' 카테고리의 다른 글
[오류해결] Error LNK1181 cannot open file 'kernel32.lib' (0) | 2022.07.29 |
---|---|
[OpenSSL] OpenSSL 설치 및 Visual Studio 적용하기 (0) | 2021.10.18 |
C언어로 만드는 DES 복호화 예제(python 코드도 포함) (5) | 2021.10.17 |
댓글