Какие флаги необходимо расставить для компилятора g++(к примеру) в системе cmake(к примеру), чтобы он скомпилировал и собрал программу с потоками?

Пожалуйста подскажите. Программу необходимо скомпилировать так, чтобы не появлялись ошибки компиляции и линковки, связанные с "undefined reference" и тд, при самых простых образцах кода, использующего

(1) Для программы, использующей std::thread в своём коде. Компилятор g++, под Linux(Вопрос для уточнения, не сильно важный).

(2) Для программы, использующей boost::thread. Компилятор также g++, под Linux.

Хочется раз и навсегда уточнить эти вопросы. И дополнительно есть ещё третий вопрос по этой теме, но связанный скорее с ошибками выполнения.

(3) Дело в том что при запуске простой программы на конкретной плате при компиляторе g++-arm-linux-gnueabi с флагами " -Wall --static -marm -march=armv5tej -std=c++17 -pthread" программа со следующим кодом выполняется(однако как минимум одна итерация цикла функции TimeOutWork успевает выполниться) с ошибкой(terminated called after throwning an instance of 'std::system_error'). Какие могут быть ошибки в данном коде, которые приводят к этому(программа тестовая, на стандартном компиляторе запускается и работает без ошибок каких-либо)?:

std::atomic<bool> runStatus = true;
std::atomic<bool> waitStatus = false; 

 void Constole()
 {
      std::string cmd;

      while(runStatus)
      {
           waitStatus = true;
           std::cin >> cmd;
           if(cmd == "stop")
           {
                  runStatus = false;
                  break;
           }
     
           waitStatus = false;
           std::this_thread::sleep_for(std::chrono::milliseconds(100));
       }
  }
  
  void TimeOutWork()
  {
        while(runStatus)
        {
             if(!waitStatus)
             {
                 std::cout << " I am here!" << std::endl;
             }
             std::this_thread::sleep_for(std::chrono::milliseconds(40));
   }
 }
 
 int main()
 {
     std::thread consoleThread(Constole);
     std::thread workThread(TimeOutWork);
     consoleThread.join(); 
     workThread.join();
     return 0;
 }

Ответы (3 шт):

Автор решения: KoVadim

Раз уж хочется буста (но это такое), то можно сделать вот так. Вначале исправим main.cpp

#include <iostream>
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <atomic>

std::atomic<bool> runStatus{true};
std::atomic<bool> waitStatus{false};

 void Constole()
 {
      std::string cmd;

      while(runStatus)
      {
           waitStatus = true;
           std::cin >> cmd;
           if(cmd == "stop")
           {
                  runStatus = false;
                  break;
           }

           waitStatus = false;
           boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
       }
  }

  void TimeOutWork()
  {
        while(runStatus)
        {
             if(!waitStatus)
             {
                 std::cout << " I am here!" << std::endl;
             }
             boost::this_thread::sleep_for(boost::chrono::milliseconds(40));
   }
 }

 int main()
 {
     boost::thread consoleThread(Constole);
     boost::thread workThread(TimeOutWork);
     consoleThread.join();
     workThread.join();
     return 0;
 }

И напишем вот такой CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(test)
find_package(Threads REQUIRED)
find_package(Boost COMPONENTS thread chrono system REQUIRED)
add_executable(test main.cpp)
target_link_libraries(test Boost::thread Boost::chrono)

все компилится и работает. Если нужна поддержка кросскомпиляции - тут нужно применять подходящие тулчейны.

→ Ссылка
Автор решения: NeutralBBName

Чтобы проект использующий boost::thread и boost::chrono(опционально) скомпилировался необходимо в системе CMake указать следующий код:

cmake_minimum_required(VERSION 3.14)
project(test)
set(CMAKE_CXX_STANDARD 11)
find_package(Threads REQUIRED)
set(SOURCE_FILES main.cpp)
find_package(Boost COMPONENTS thread chrono system REQUIRED)
add_executable(test ${SOURCE_FILES})
include_directories(${Boost_INCLUDE_DIR})
target_link_libraries(test ${Boost_LIBRARIES})

Проверялось только на коде, что указан выше.

→ Ссылка
Автор решения: NeutralBBName

(2) Проблема того что std-потоки не работали, крылась в том что были некорректно сконфигурированы файлы процессора, при прошивке. Из-за чего при обращении к нужным инструкциям вылетали ошибки, а операционная система завершала свою работу. Теперь std-потоки работают.

(3) Для компиляции программы с использованием boost-потоков необходимо самому скомпилировать исходный код этих потоков, под конкретную процессорную архитектуру.

Так что теперь вопрос можно окончательно закрыть.

→ Ссылка