Использование boost asio tcp в visual studio 2017 с CMake - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь включить и использовать boost ASIO TCP в простом проекте Visual Studio 2017 с CMake, но я получаю эту ошибку при запуске проекта:

LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'

Это шаги для подготовкипроект:

  1. Обновление VS 2017 до последней версии (15.7.2)
  2. Загрузка надстройки 1.67.0
  3. В командной строке VS запустите Bootstrap и b2.exe
  4. Определение Boost_ROOT в переменных среды
  5. Создание проекта CMake в VS

Тогда это мой CMakeList.text:

cmake_minimum_required (VERSION 3.8)

project (TcpSample)
set(EXEC_NAME "TcpSample")
add_executable (${EXEC_NAME} "TcpSample.cpp" "TcpSample.h")

SET(BOOST_MANDATORY_COMPONENTS system date_time)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost "1.67.0" COMPONENTS ${BOOST_MANDATORY_COMPONENTS} 
REQUIRED)

include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(${EXEC_NAME} ${Boost_SYSTEM_LIBRARY})

И, наконец, код:

#include "TcpSample.h"
#include <boost/asio/ip/tcp.hpp>

using namespace std;

int main()
{
    cin.get();
    return 0;
}

Я должен отметить, что если я изменю tcp на udp, ошибки не будет.

1 Ответ

0 голосов
/ 30 мая 2018

Превращаю мои комментарии в ответ:

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

Большинство библиотек Boost являются только заголовками.Но некоторые этого не делают и требуют добавления библиотеки в команду target_link_libraries.Это можно сделать один раз для всех библиотек, найденных по команде find_package(Boost "1.67.0" COMPONENTS system date_time REQUIRED), добавив

target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})

или добавив отдельные библиотеки следующим образом

target_link_libraries(${EXEC_NAME} ${Boost_SYSTEM_LIBRARY} ${Boost_DATE_TIME_LIBRARY})

И пока вы находитесь у него, включите команду include_directories(${Boost_INCLUDE_DIRS}), который добавляет каталоги Boost для всех целей в CMakeLists.txt в конкретную цель target_include_directories(${EXEC_NAME} PUBLIC ${Boost_INCLUDE_DIRS}).Если вам нужно связать PUBLIC/PRIVATE/INTERFACE, зависит от того, предоставляет ли ваша библиотека / DLL / разделяемый объект типы из библиотек Boost.

...