VS CMakeProject with Win Socket Ws2_32.lib



  • Hallo Leute,

    ich versuche gerade ein CMake Projekt mit Windows tcp Sockets zu bauen.

    Und habe folgende eine CMakeTcpTest.cpp (main)

    #include <winsock2.h>
    #include <stdio.h>
    #include <WS2tcpip.h>
    #include "CMakeTcpTest.h"
    
    using namespace std;
    
    int main()
    {
    	WSADATA              wsaData;
    	SOCKET               SendingSocket;
    
    	// Server/receiver address
    	SOCKADDR_IN          ServerAddr, ThisSenderInfo;
    
    	// Initialize Winsock version 2.2
    	WSAStartup(MAKEWORD(2, 2), &wsaData);
    
    	cout << "Hello CMake." << endl;
    	return 0;
    }
    

    meine dazugehörige CMakefileList.txt sieht so aus:

    # CMakeList.txt: CMake-Projekt für "CMakeTcpTest". Schließen Sie die Quelle ein, und definieren Sie
    # projektspezifische Logik hier.
    #
    cmake_minimum_required (VERSION 3.8)
    
    #add_subdirectory(libs)
    
    # Fügen Sie der ausführbaren Datei dieses Projekts eine Quelle hinzu.
    add_executable (CMakeTcpTest "CMakeTcpTest.cpp" "CMakeTcpTest.h")
    
    target_link_directories (CMakeTcpTest PUBLIC /libs)
    target_link_libraries (CMakeTcpTest ${CMAKE_CURRENT_SOURCE_DIR}/libs/Ws2_32.lib)
    
    #target_link_libraries(CMakeTcpTest Ws2_32.lib)
    # TODO: Fügen Sie bei Bedarf Tests hinzu, und installieren Sie Ziele.
    

    die Ws2_32.lib habe ich im Unterordner "libs" in diesem Projekt.
    Und ich weiß nicht wie ich diese lib nun zu meinem Projekt dazu linken kann. Habe bissel recherchiert aber mit "target_link_directories " und "target_link_libraries " komm ich nich weiter... die Ws2_32.dll , muss die auch in die lib ordner?

    Ich verwende Vs2019 in Windows10.

    Wenn ich das ganze dann folgende Fehler:

    Schweregrad	Code	Beschreibung	Projekt	Datei	Zeile	Unterdrückungszustand
    Warnung	C6031	Rückgabewert wird ignoriert: "WSAStartup".	CMakeTcpTest	C:\Users\schwebo\source\repos\CMakeTcpTest\CMakeTcpTest\CMakeTcpTest.cpp	19	
    Warnung	C4101	"SendingSocket": Unreferenzierte lokale Variable	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest	C:\Users\schwebo\source\repos\CMakeTcpTest\CMakeTcpTest\CMakeTcpTest.cpp	13	
    Warnung	C4101	"ThisSenderInfo": Unreferenzierte lokale Variable	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest	C:\Users\schwebo\source\repos\CMakeTcpTest\CMakeTcpTest\CMakeTcpTest.cpp	16	
    Warnung	C4101	"ServerAddr": Unreferenzierte lokale Variable	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest	C:\Users\schwebo\source\repos\CMakeTcpTest\CMakeTcpTest\CMakeTcpTest.cpp	16	
    Fehler	LNK2019	Verweis auf nicht aufgelöstes externes Symbol "__imp_WSAStartup" in Funktion "main".	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest.cpp.obj	1	
    Warnung	LNK4272	Bibliothekcomputertyp "x86" steht in Konflikt mit dem Zielcomputertyp "x64"	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest	C:\Users\schwebo\source\repos\CMakeTcpTest\CMakeTcpTest\libs\Ws2_32.lib	1	
    Fehler	LNK1120	1 nicht aufgelöste Externe	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest	C:\Users\schwebo\source\repos\CMakeTcpTest\out\build\x64-Debug (Standard)\CMakeTcpTest\CMakeTcpTest.exe	1
    

    woran hakt es , außer in meine Inkompetenz ? 🙂

    Danke Euch



  • Ich habe nun herausgefunden, dass es am x64 liegt.. lasse ich das ganze in x86 bauen geht das:

    {
      "configurations": [
        {
          "name": "x64-Debug (Standard)",
          "generator": "Ninja",
          "configurationType": "Debug",
          "inheritEnvironments": [ "msvc_x64_x64" ],
          "buildRoot": "${projectDir}\\out\\build\\${name}",
          "installRoot": "${projectDir}\\out\\install\\${name}",
          "cmakeCommandArgs": "",
          "buildCommandArgs": "",
          "ctestCommandArgs": "",
          "variables": []
        },
        {
          "name": "x86-Debug (Standard)",
          "generator": "Ninja",
          "configurationType": "Debug",
          "inheritEnvironments": [ "msvc_x86" ],
          "buildRoot": "${projectDir}\\out\\build\\${name}",
          "installRoot": "${projectDir}\\out\\install\\${name}",
          "cmakeCommandArgs": "",
          "buildCommandArgs": "",
          "ctestCommandArgs": "",
          "variables": []
        }
      ]
    }
    

    aber nun mein frage, woher bekomme ihc die ws2_32.lib für 64bit? laut google ist das MS lib naming etwas doof die heißen gleich.. muss ich jetzt eine ws2_32.lib für x64 in eine extra verzeichnis packen und darin verlinken? wie kann ich das lösen?



  • @SoIntMan sagte in VS CMakeProject with Win Socket Ws2_32.lib:

    muss ich jetzt eine ws2_32.lib für x64 in eine extra verzeichnis packen und darin verlinken? wie kann ich das lösen?

    Das kannst Du prinzipiell machen wie Du willst. Aber nach POLA besser nicht umbenennen und ins selbe Verzeichnis sondern in zwei seperate und den Namen belassen.



  • ok danke, und die wsock32.dll is in dem fall obsolet? wenn ich jetzt die ws2_32.lib jeweil als x86 und x64 in zwei Verzeichnisse habe, muss ich ja in CMake irgendwie wissen welche er jetzt linken soll !? oder beide linken und er sucht sich eine raus? hmm.. alles neuland;)



  • @SoIntMan sagte in VS CMakeProject with Win Socket Ws2_32.lib:

    ok danke, und die wsock32.dll is in dem fall obsolet?

    Ähm. Du weißt schon was der Unterschied zwischen einer Import library und einer DLL ist?



  • ich meinte ".lib" sorry:) ja ich suche noch wo ich die libs finde... dachte durch die installation von VS, sind alles SDK libs dabei...

    https://stackoverflow.com/questions/17797594/winsock2-h-vs-winsock2-h-and-wsock32-lib-vs-ws2-32-lib



  • C:\Program Files (x86)\Windows Kits\10\Lib\[version]\um\x64
    C:\Program Files (x86)\Windows Kits\10\Lib\[version]\um\x86



  • pefekt , super vielen dank;))))



  • Guten Morgen,

    zwei Fragen habe ich noch:

    • ListenpunktDie ws2_32.dll im Windows system Verzeichnis, implementiert die 32 und 64 bit Variante , richtig??

    • ListenpunktWenn ich nun x86 oder x64 builde, dann gebe ich ja dem linker an wo die entsprechende lib (import library) dafür liegt, woher weiß der linker wo die Dll hierfür is (ws2_32.dll) ? Braucht er die überhaupt zwingend , beim builden?

    Wenn ich die exe startet,, muss aber die dll im exe Verzeichnis liegen!! oder? Habe ich mir jetzt gerade die 2.te Frage selbst beantwortet?:)

    Danke und Schönen Tag Euch



  • @SoIntMan sagte in VS CMakeProject with Win Socket Ws2_32.lib:

    Die ws2_32.dll im Windows system Verzeichnis, implementiert die 32 und 64 bit Variante , richtig??

    Ne, eine DLL für beide Architekturen gleichzeitig gibt's nicht.
    What’s the Difference Between the “System32” and “SysWOW64” Folders in Windows?

    @SoIntMan sagte in VS CMakeProject with Win Socket Ws2_32.lib:

    woher weiß der linker wo die Dll hierfür is (ws2_32.dll) ?

    Das interessiert den Linker nicht. Das interessert den Loader des OS wenn er executables lädt.
    Windows Internals 6th Edition Part 1 - Chapter 5: Processes, Threads, and Jobs (pdf)

    @SoIntMan sagte in VS CMakeProject with Win Socket Ws2_32.lib:

    Wenn ich die exe startet,, muss aber die dll im exe Verzeichnis liegen!! oder?

    Dynamic-Link Library Search Order



  • Hallo Swordfish, sorry etwas spät.. aber Danke Dir für deine Hilfe;)


Anmelden zum Antworten