2016-04-09 3 views
0

Это как мой CMakeLists.txt выглядитИспользование ASIO автономных заголовков библиотеки

Я скачал asio библиотеки из here. Он состоит из многих файлов заголовков, которые вы должны включить в свой проект. Проблема в том, что эти заголовки находятся внутри каталогов, а операторы #include просто не соответствуют правильному каталогу.

Например, у них есть файл asio/async_result.hpp. Этот файл содержит asio/detail/config.hpp. Однако это должно быть ../asio/detail/config.hpp

Что я должен делать? Одиночно переименуйте все эти 200 файлов заголовков, чтобы они соответствовали правильной структуре каталогов? Почему они ошибаются из коробки?

1

+0

Просто примечание к будущим читателям: 'asio' теперь часть' импульс :: asio'. Не устанавливайте его изолированно, но получайте его от повышения. –

+0

Директивы include в Asio требуют, чтобы Asio был доступен в пути включения. Добавляет ли каталог 'server_client' в путь include через' include_directories() 'к вашему файлу CMakeLists.txt решить проблему (например,' include_directories ($ {CMAKE_CURRENT_SOURCE_DIR}) '? –

+0

@TannerSansbury Я пишу ответ на этот вопрос – dimitris93

ответ

-1

Вот мой рабочий обновляется CMakeLists.txt:

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}) 

На моем файле источник .cpp вы должны добавить

// 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

Это своего рода плохой стиль; обычно гораздо предпочтительнее использовать существующий модуль CMake «Найти ...» для установки опций include и linker или для записи самостоятельно; например, вы действительно очень мало используете cmake. Опять же, для автономного asio нет «стандартного» модуля cmake для выполнения thins, ([но googling находит некоторые, которые вам нужно будет внести только с несколькими подсказками для окон) (http://www.na-mic.org /svn/NAMICSandBox/WFEngine/FindAsio.cmake)), но для 'boost :: asio' вы получаете проверенные, надежные подпрограммы поиска библиотек. –

+1

Даунвотинг для «Я признаю, что я не знаю, что я делаю» '# define' здесь: вы произвольно устанавливаете свою [константу версии Windows] (https://msdn.microsoft.com/en-us/library/ 6sehtctf.aspx) в Windows XP с непредвиденными побочными эффектами. Жесткое кодирование вашей ОС и версии ОС в ваш код делает его не переносным. Опять же, вы должны обнаружить свою версию Windows в CMake и установить ее соответствующим образом. –

+0

@ MarcusMüller Вы говорите, что флаг '-I' - это плохой способ включить в проект проект только для заголовка? В моей среде IDE, Clion, библиотека отлично распознает библиотеку. Что именно вы предлагаете вместо этого? Что касается версии '_WIN32_WINNT', я считаю, что версия Windows XP просто минимальна, поэтому ее использование будет работать на компьютере с Windows XP и выше. Это впечатление, которое я получил от «предупреждения», которое я получил при компиляции без этого флага. – dimitris93

1

Вы должны установить эти заголовки первого. В большинстве систем (кроме окон, конечно), есть типичный путь, где такие включенные файлы в конечном итоге.

Это работа системы сборки вашего проекта (например CMake) для ASIO найти на своем компьютере и настроить компилятор таким образом, что он выглядит в этих папках, и находит нужные файлы, если вы

#include <asio/handler_type.hpp> 

Do never создайте свой проект в пределах. Вы имеете , используя (если, конечно, вы не захотите изменить или расширить эту библиотеку). Создайте проект где-то еще и скажите cmake, чтобы посмотреть asio.

Кроме того, если ваш исходный код не является частью самой библиотеки, вы никогда не должны включать файлы _detail.hpp; они обычно не являются частью API, которые используют пользователи библиотеки, но являются внутренними структурами.

РЕДАКТИРОВАТЬ

Как было отмечено выше, asio теперь является частью наддува, поэтому установить импульс, включая его boost::asio модуль правильно, проинструктировать CMake к

find_package(Boost COMPONENTS asio) 

и использовать, например,

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

Дополнительную информацию можно найти на официальном сайте Boost asio Tutorial.

+0

Как я могу установить заголовки? – dimitris93

+0

@Shiro скопируйте их в нужный каталог. Обычно библиотека поставляется со сценариями и инструкциями по установке. –

+0

Кстати, сегодня один woutld использует 'boost :: asio' вместо' asio', потому что 'asio' стал включенным с повышением довольно давно и продолжает развиваться в сообществе повышения. –

Смежные вопросы