2016-04-09 6 views
0

Dies ist, wie meine CMakeLists.txt sieht aus wieMit Asio Standalone-Header Bibliothek

ich die asio Bibliothek von here heruntergeladen. Es besteht aus vielen Header-Dateien, die Sie in Ihr Projekt aufnehmen müssen. Das Problem ist, dass diese Header innerhalb von Verzeichnissen liegen und die #include-Anweisungen nicht mit dem richtigen Verzeichnis übereinstimmen.

Zum Beispiel haben sie eine asio/async_result.hpp Datei. Diese Datei enthält asio/detail/config.hpp. Es sollte aber ../asio/detail/config.hpp

Was soll ich tun? Einfach all diese 200 Header-Dateien manuell in die richtige Verzeichnisstruktur umbenennen? Warum sind sie falsch out of the box?

1

+0

Nur ein Hinweis auf zukünftige Leser hinzufügen: 'asio' ist jetzt Teil von' boost :: asio'. Installieren Sie es nicht isoliert, sondern erhalten Sie es von Boost. –

+0

Die Include-Anweisungen in Asio erfordern, dass Asio im Include-Pfad verfügbar ist. Fügen Sie das 'server_client'-Verzeichnis dem Include-Pfad über' include_directories() 'in Ihre CMakeLists.txt-Datei hinzu, um das Problem zu beheben (z. B. include_directories ($ {CMAKE_CURRENT_SOURCE_DIR})? –

+0

@TannerSansbury Ich schreibe eine Antwort auf diese Frage – dimitris93

Antwort

-1

meine Arbeit hier CMakeLists.txt aktualisiert:

cmake_minimum_required(VERSION 3.3) 
project(server_client) 

# take a look at the -I command 
# this will incude all the header files in your project. So simple 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -I C:/Users/Shiro/Desktop/asio-1.10.6/include") 
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS} -static") 
# Don't forget this! The libws2_re.lib library is 100% required for windows ! 
# I also added libwsock32.lib, not sure if thats necessary 
# Those .lib files are located at C:\MinGW\lib on my machine 
# That directory is located automatically, you don't have to add the full path 
link_libraries(ws2_32 wsock32) 


set(SOURCE_FILES chat_server.cpp) 
add_executable(server_client ${SOURCE_FILES}) 

Auf meiner Quell .cpp Datei

// this is required otherwise asio tries to include 
// other boost libraries which you won't have installed 
// or you could add a -DASIO_STANDALONE flag right next to -std=c++11 in CMakeLists.txt 
#define ASIO_STANDALONE 

#ifndef _WIN32_WINNT 
#define _WIN32_WINNT 0x0501 // windows stuff, not sure what this does 
#endif 

#include <asio.hpp> // include asio library 
+1

Das ist eine Art schlechter Stil; Es ist normalerweise sehr vorzuziehen, ein vorhandenes CMake "Find ..." - Modul zu verwenden, um die Include- und Linker-Optionen festzulegen oder selbst zu schreiben; So gewinnt man sehr wenig, wenn man CMake einsetzt. Für Standalone-Asio gibt es kein "Standard" -CMake-Modul, um Thins zu tun, ([aber Googling findet einige, die Sie nur mit ein paar Hinweisen für Windows ändern müssten] (http://www.na-mic.org) /svn/NAMICSandBox/WFEngine/FindAsio.cmake)), aber für 'boost :: asio' erhalten Sie gut getestete, robuste Bibliotheks-Suchroutinen. –

+1

Downvoting für die "Ich gebe zu, ich weiß nicht, was ich tue" "# define" hier: Sie setzen willkürlich Ihre [Windows-Version konstant] (https://msdn.microsoft.com/en-us/library/ 6sehtctf.aspx) zu Windows XP mit unvorhergesehenen Nebenwirkungen. Wenn Sie Ihre Betriebssystem- und Betriebssystemversion in Ihrem Code fest codieren, wird sie nicht portierbar. Auch hier sollten Sie Ihre Windows-Version in CMake erkennen und entsprechend einstellen. –

+0

@ MarcusMüller Sie sagen, dass das '-I' Flag eine schlechte Möglichkeit ist, eine Header-Only-Bibliothek in mein Projekt aufzunehmen? In meiner IDE, Clion, erkennt die Bibliothek die Bibliothek perfekt. Was genau schlagen Sie stattdessen vor? Soweit die '_WIN32_WINNT'-Version geht, glaube ich, dass die Windows XP-Version einfach das Minimum ist, so dass die Verwendung zu einem Windows XP-Computer und höher ausgeführt wird. Das ist der Eindruck, den ich von einer "Warnung" habe, die ich beim Kompilieren bekommen habe, ohne dass diese Flagge definiert wurde. – dimitris93

1

Sie müssen erste diese Header installieren. Auf den meisten Systemen (abgesehen von Windows, natürlich) gibt es einen typischen Pfad, in dem solche Include-Dateien enden.

Es ist die Aufgabe Ihres Build-System des Projektes (zB Cmake) Asio auf Ihrem Computer zu finden und die Compiler so konfiguriert, dass es in diesen Ordnern sucht und findet die richtigen Dateien, wenn Sie

#include <asio/handler_type.hpp> 

tun Do nie Erstellen Sie Ihr Projekt innerhalb die Bibliothek Sie sind mit (es sei denn, natürlich möchten Sie diese Bibliothek ändern/erweitern). Erstellen Sie ein Projekt woanders und teilen Sie cmake mit, um nach Asio zu suchen.

Auch, wenn Ihr Quellcode nicht Teil der Bibliothek selbst ist, sollten Sie niemals _detail.hpp Dateien einfügen; Diese sind normalerweise nicht Teil der API, die Benutzer einer Bibliothek verwenden, sondern interne Strukturen.

EDIT

Wie oben erwähnt, asio ist jetzt Teil von Boost, so installieren Boost einschließlich seiner boost::asio Modul richtig anweisen cmake zu

find_package(Boost COMPONENTS asio) 

und verwenden zum Beispiel

#include <boost/asio.hpp> 
#include <boost/thread/thread.hpp> 

Weitere Beispiele finden Sie im offiziellen Boost asio Tutorial.

+0

Wie genau installiere ich Header? – dimitris93

+0

@Shiro kopieren Sie sie in das richtige Verzeichnis. Normalerweise enthält eine Bibliothek Skripte und Anweisungen zur Installation. –

+0

Übrigens würde man heute 'boost :: asio' anstelle von' asio' verwenden, weil 'asio' schon vor einiger Zeit mit boost aufgenommen wurde und innerhalb der boost-community kontinuierlich weiterentwickelt wird. –