2017-09-23 19 views
0

私は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"); 
+0

我々はそれを見ることができないので、あなたのリンケージのコマンドを使用して、間違っているものを言うことができません。 clion出力を冗長出力に置き換えてください( 'make VERBOSE = 1') –

+0

冗長モードを有効にするには? – MNCODE

答えて

1

まずは#pragma comment(lib, "WS2_32.lib")を削除します。これはVisual C++コンパイラ指令です。

2番目に、CMakeLists.txtは提供されていません.Crionはクロスプラットフォームソリューションを目指しており、指定された環境(toolchainタブ)のCMakeを構成します。つまり、gccを呼び出してライブラリを手動でリンクする必要はありません。add_executable(myexecutable)の後に必要なのはtarget_link_libraries(myexecutable ws2_32)です。

第3に、Win95との下位互換性を望んでいない限り、wsock32.libは実際にあなたのプロジェクトにリンクされている必要はありません。詳細はthis answerを参照してください。

あなたのトップレベルcmakeのファイルには、(私が成功したビルドを持っている)のようになります。

# system 
cmake_minimum_required(VERSION 3.6) 
set(CMAKE_C_STANDARD 99) 

# project 
project(WinsockExample C) 

# sources 
set(source_files 
    main.c 
    ) 

# build 
add_executable(${CMAKE_PROJECT_NAME} ${source_files}) 
target_link_libraries(${CMAKE_PROJECT_NAME} ws2_32) 
+1

そんなに助けてくれてありがとうございます:) – MNCODE

+0

@MNCODEはあなたを助けてうれしいです。ところで、少し間違いましたが、 'add_executable()'は 'source_files'変数を使用することになっていました。 – Liastre

関連する問題