Как автоматически связать библиотеки повышения с CMake - PullRequest
1 голос
/ 12 февраля 2020
project(learn)

cmake_minimum_required(VERSION 3.11)

set(CMAKE_CXX_STANDARD 17)

if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    message("Current OS is Linux")
    include_directories("/mnt/e/c++/boost_1_72_0")
    link_directories("/mnt/e/c++/boost_1_72_0/stage/lib")
    link_libraries(pthread boost_thread boost_fiber boost_context)
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
    message("Current OS is Windows")
    include_directories("E:/c++/boost_1_72_0")
    link_directories("E:/c++/boost_1_72_0/stage/lib")
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")

add_executable(learn_asio learn_asio.cpp)

learn_asio. cpp:

#include <boost/asio.hpp>
#include <boost/fiber/all.hpp>
#include <boost/thread.hpp>
#include <iostream>

using boost::asio::async_write;
using boost::asio::buffer;
using boost::asio::io_context;
using boost::asio::use_future;
using boost::asio::ip::make_address;
using boost::asio::ip::tcp;
using boost::fibers::async;
using boost::fibers::fiber;
using boost::system::error_code;

int main(){
  io_context ioc;
  tcp::socket socket(ioc);

  tcp::endpoint ep(make_address("192.168.1.20"), 80);

  auto ret_f = socket.async_connect(ep, boost::asio::use_future);

  boost::thread_group t;
  t.create_thread([&ioc]() {
    ioc.run();
    std::cout << "jfiejf" << std::endl;
  });

  ret_f.wait_for(std::chrono::seconds(3));

  t.join_all();

  return 0;
}

Папка моей библиотеки: boost library folder Согласно приведенному выше коду, я могу успешно построить свой код. Но я ненавижу код:

link_libraries(pthread boost_thread boost_fiber boost_context)

на платформе linux. Почему он мне не нужен на windows платформах? Насколько я помню, Linux может автоматически связывать библиотеку. Как мне этого добиться?

1 Ответ

1 голос
/ 12 февраля 2020

Повышение документации :

Автоматическое связывание

Большинство Windows компиляторов и компоновщиков имеют так называемые «автоматические связывание поддержки », что устраняет вторую проблему. Специальный код в заголовочных файлах Boost определяет параметры вашего компилятора и использует эту информацию для кодирования имени правильной библиотеки в ваши объектные файлы; компоновщик выбирает библиотеку с таким именем из каталогов, которые вы сказали ему искать.

Наборы инструментов G CC (Cygwin и MinGW) являются заметными исключениями; Пользователям G CC следует обратиться к инструкциям по связыванию для Unix вариантов ОС для соответствующих параметров командной строки для использования.

Обратите внимание, что функция автоматического связывания имеет было известно, что иногда происходит сбой (например, когда ваши библиотеки Boost установлены с использованием нестандартных настроек). Вы можете определить от BOOST_ALL_NO_LIB до отключить функцию для Windows.

Однако вы не должны жестко программировать пути Boost в вашем CMakeLists.txt. Лучше использовать независимую от платформы find_package:

set( Boost_USE_STATIC_LIBS OFF )
set( Boost_USE_MULTITHREADED ON )
set( Boost_USE_STATIC_RUNTIME OFF )

find_package( Boost 1.72.0 COMPONENTS thread fiber context )

if ( Boost_FOUND )
    include_directories( ${Boost_INCLUDE_DIRS} )
    link_libraries( learn_asio ${Boost_LIBRARIES} )
else()
    message( FATAL_ERROR "Required Boost packages not found. Perhaps add -DBOOST_ROOT?" )
endif()
...