私はwinsock2を使って簡単なサーバーをプログラムしようとしています。私はそれを正しくコンパイルすることはできません。C winsock2.h WS2_32.lib undefinedへの参照
#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include "dump.h"
#pragma comment(lib,"WS2_32.lib")
#define PORT 7890
int main(void)
{
//fd --> file descriptor
int sockfd, new_sockfd; //warten an sockfd, neue Verbindung an new_sockfd
struct sockaddr_in host_addr, client_addr; //Addressinformationen
//sockaddr_in aus winsock.h
//Laenge des Inputs --> winsock Alternative suchen
socklen_t sin_size;
int recv_length = 1, yes = 1;
char buffer[1024];
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
//PF_INET --> Protocol family
//AF_INET --> Addres family
printf("%s\n", "in socket");
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(int)) == -1)
printf("%s\n", "setting socket option SO_REUSEADDR");
//vorbereiten auf den bind-Befehl
host_addr.sin_family = AF_INET;
host_addr.sin_port = htons(PORT);
//htons --> host to network short
//Wandelt bei 16 Bit int Hostbytereihenfolge in Netzwerkbytereihenfolge
host_addr.sin_addr.s_addr = 0; //Automatisch mit meiner IP fuellen
memset(&(host_addr.sin_zero), '\0', 8); // Rest der Struktur mit 0 fuellen
if (bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
printf("%s\n", "binding to socket");
if (listen(sockfd, 5) == -1)
{
printf("%s\n", "listening on socket");
}
//Schleife um am PORT zu lauschen und Verbindungen zu akzeptieren
while (1)
{
sin_size = sizeof(struct sockaddr_in);
//accept gibt neuen sockfd zurueck !
new_sockfd =
accept(sockfd, (struct sockaddr *) &client_addr, &sin_size);
if (new_sockfd == -1)
{
printf("%s\n", "accepting connection");
}
printf("server: got connection from %s port %d\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
send(new_sockfd, "Hello, world!\n", 13, 0);
recv_length = recv(new_sockfd, buffer, 1024, 0);
while (recv_length > 0)
{
printf("RECV: %d bytes \n", recv_length);
dump(buffer, recv_length);
recv_length = recv(new_sockfd, buffer, 1024, 0);
}
closesocket(new_sockfd);
}
return 0;
}
これはLinuxの最初のsocket.hですが、私はwindows7の下でwinsock2で実装しようとしました。私は手動でWindows SDKをインストールし、リンクするライブラリWs2_32.libを見つけました。 CLIONでgcc(mingw32)を使ってコンパイルしています。私はパラメタフラグを設定しました
-lws2_32 -lwsock32
私はこの質問に答える多くの記事がありますが、何も私のために動作しないようです。私はgccでコンパイルする今、次のコマンドを使用
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" --build C:\Users\Marcel\Desktop\Projekte\C-Projekte\Sequenz-Uebungen\Simple_Server\cmake-build-debug --target Simple_Server -- -j 2
[ 50%] Linking C executable Simple_Server.exe
CMakeFiles\Simple_Server.dir/objects.a(main.c.obj): In function `main':
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:49: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:53: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:58: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:64: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:66: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:78: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:84: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:83: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:85: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:86: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:91: undefined reference to `[email protected]'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:93: undefined reference to `[email protected]'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\Simple_Server.dir\build.make:95: recipe for target 'Simple_Server.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/Simple_Server.dir/all' failed
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/Simple_Server.dir/rule' failed
mingw32-make.exe[3]: *** [Simple_Server.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/Simple_Server.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/Simple_Server.dir/rule] Error 2
Makefile:117: recipe for target 'Simple_Server' failed
mingw32-make.exe: *** [Simple_Server] Error 2
:
gcc -Wl,-verbose -lws2_32 -lwsock32 -o simple_server main.c > linker.txt
それは出力を次与えます:
冒頭==================================================
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o succeeded
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o succeeded
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0\libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc\libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib\libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libws2_32.a succeeded
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0\libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/wsock32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/wsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc\libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib\libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libwsock32.a succeeded
このCLIONから
出力:
using internal linker script:
==================================================
/* Default linker script, for normal executables */
/* Copyright (C) 2014-2017 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT(pei-i386)
SEARCH_DIR("/mingw/mingw32/lib"); SEARCH_DIR("/mingw/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
我々はそれを見ることができないので、あなたのリンケージのコマンドを使用して、間違っているものを言うことができません。 clion出力を冗長出力に置き換えてください( 'make VERBOSE = 1') –
冗長モードを有効にするには? – MNCODE