Hatred's Log Place

DON'T PANIC!

Dec 13, 2011 - 1 minute read - programming c++

Boost, CMake, кросскомпиляция

  • Q: Boost.Asio - что нужно указать в cmake среди компонентов при поиске библиотеки boost?
    A: только библиотеку system:
    find_package(Boost REQUIRED COMPONENTS system)
    
  • Q: Boost.Thread и кроскомпиляция - что делать, если получаем ошибку вида: undefined reference to 'boost::tss_cleanup_implemented()'?
    A: для начала чуток обратно: в случае Linux, в качестве компонента при поиске библиотеки нужно указывать thread, а в случае windows (и кроскомпиляции): thread_win32, т.е. необходимо писать что-то вроде такого кода:
    set(BOOST_COMPONENTS
        program_options
        system)
    # Boost thread library is different on Win/Linux
    if(WIN32)
      set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread_win32)
    else()
      set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread)
    endif()
    ...
    find_package(Boost COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
    
    Подсказку увидел тут: https://lists.gnu.org/archive/html/mingw-cross-env-list/2010-11/msg00063.html. Так же следует добавить следующее (при статической линковке):
    add_definitions(-DBOOST_THREAD_USE_LIB=1)
    
    Далее, собственно, относительно самого вопроса, предлагают в случае появления такой ошибки при компиляции, поместить в любой свой исходник следующее:
    namespace boost {
    void tss_cleanup_implemented() { }
    }
    
    чистой воды хак :) Дополнительно написано тут: https://solarcore.blogspot.com/2010/10/boost-c-threads-mingw-mac-os-x.html