Невозможно запустить простую тестовую программу std :: async и std :: future.Ошибка: "имеет инициализатор, но неполный тип."В чем дело? - PullRequest
1 голос
/ 06 апреля 2019

Я пробую свои силы в асинхронных вызовах функций в C ++ с использованием std::async в соответствии с этим официальным cplusplus.com примером кода.

К сожалению, компиляция не удалась.При запуске mingw32-make я получаю следующие ошибки:

  • main.cpp:37:23: error: variable 'std::future<bool> the_future' has initializer but incomplete type

  • main.cpp:37:61: error: invalid use of incomplete type 'class std::future<bool>'

Я также попытался запустить make через WSL (Подсистема Windows для Linux), что по сути делает Linux bash доступным в Windows.Там тоже не работает:

main.o: In function `std::thread::thread<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<bool (*)(int), long> >, bool>::_Async_state_impl(std::thread::_Invoker<std::tuple<bool (*)(int), long> >&&)::{lambda()#1}>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<bool (*)(int), long> >, bool>::_Async_state_impl(std::thread::_Invoker<std::tuple<bool (*)(int), long> >&&)::{lambda()#1}&&)':
/usr/include/c++/7/thread:122: undefined reference to `pthread_create'

Я пробовал следующее:

  1. Обновление моего компилятора с использованием этого SO ответа .

  2. Как отмечалось выше, попытка сделать, используя два разных подхода.Оба сбоя.

  3. Использование gcc вместо g++ (просто другой компилятор).

Вот main.cpp:

#include <iostream>
#include <string>
#include <cstdlib>
#include <future>


// a non-optimized way of checking for prime numbers
bool is_prime (int x) 
{
    std::cout << "Calculating. Please, wait..." << std::endl;
    for (int i=2; i<x; ++i)
    {
        if(x % i == 0) return false;
    }
    return true;
}


void interpret_result (bool result)
{
    if (result)
    {
        std::cout << "It is prime!" << std::endl;
    }
    else
    {
        std::cout << "It is not prime!" << std::endl;
    }
}


int main()
{
    long num = 313222313;

    // The result of the asynchronous call to is_prime will be stored in the_future
    std::future<bool> the_future = std::async (is_prime, num);

    std::cout << "Checking whether " << num << " is a prime number!" << std::endl;

    // Nothing beyond this line runs until the function completes
    bool result = the_future.get();

    // Interpret the result
    interpret_result (result);

    // So the cmd window stays open
    system ("pause");
    return 0;
}

А вот мой make-файл (я хотел бы создать его для каждого проекта просто на практике):

COMPILER = g++

COMPILER_FLAGS = -std=c++17 -Wall -g

LINKER_FLAGS = 

EXECUTABLE = async

all: main clean

main: main.o
    $(COMPILER) $(LINKER_FLAGS) -o $(EXECUTABLE) main.o

main.o: main.cpp
    $(COMPILER) $(COMPILER_FLAGS) -c main.cpp

.PHONY: clean

clean:
    rm *.o

Я не уверен, почему этот код не компилируется.Я прошел через это и не могу определить какие-либо ошибки.mingw успешно обновлен (после этого я перезапустил свой терминал).

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 06 апреля 2019
main.o: In function `std::thread::thread<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<bool (*)(int), long> >, bool>::_Async_state_impl(std::thread::_Invoker<std::tuple<bool (*)(int), long> >&&)::{lambda()#1}>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<bool (*)(int), long> >, bool>::_Async_state_impl(std::thread::_Invoker<std::tuple<bool (*)(int), long> >&&)::{lambda()#1}&&)':
/usr/include/c++/7/thread:122: undefined reference to `pthread_create'

Это можно исправить, связавшись с библиотекой pthread, возможно, добавив -lpthread к вашему LINKER_FLAGS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...