Compiling simple Boost Process code fails

320 views Asked by At

I'm trying to implement a platform-independent function (working on Windows/Linux/Mac OS X) for calling an external process using boost/process.hpp as follows:

#include <sstream>
#include <boost/process.hpp>

std::string execute_external_process(const std::string &command,
                                     const std::vector<std::string> &arguments) {
    boost::process::ipstream out;
    boost::process::child child(boost::process::search_path(command), arguments,
                                boost::process::std_out > out, boost::process::std_err > out);
    std::stringstream process_output_builder;
    std::string line;
    while (child.running() && std::getline(out, line) && !line.empty()) {
        process_output_builder << line;
        process_output_builder << "\n";
    }

    child.wait();

    return process_output_builder.str();
}

However, I'm getting the following Boost compilation error:

In file included from /usr/include/boost/process/async.hpp:35,
                 from /usr/include/boost/process.hpp:23,
                 from ../src/ExternalProcessUtils.cpp:4:
/bin/vcpkg/installed/x64-linux/include/boost/asio/io_service.hpp:27:20: error: conflicting declaration ‘typedef class boost::asio::io_context boost::asio::io_service’
   27 | typedef io_context io_service;
      |                    ^~~~~~~~~~
In file included from /usr/include/boost/process/detail/traits.hpp:11,
                 from /usr/include/boost/process/async.hpp:32,
                 from /usr/include/boost/process.hpp:23,
                 from ../src/ExternalProcessUtils.cpp:4:
/usr/include/boost/process/detail/traits/async.hpp:15:7: note: previous declaration as ‘class boost::asio::io_service’
   15 | class io_service;
      |       ^~~~~~~~~~
In file included from /usr/include/c++/10/bits/move.h:57,
                 from /usr/include/c++/10/bits/stl_pair.h:59,
                 from /usr/include/c++/10/bits/stl_algobase.h:64,
                 from /usr/include/c++/10/vector:60,
                 from ../src/ExternalProcessUtils.hpp:3,
                 from ../src/ExternalProcessUtils.cpp:1:
/usr/include/c++/10/type_traits: In instantiation of ‘struct std::is_base_of<boost::asio::execution::detail::any_executor_base, boost::asio::io_service>’:
/bin/vcpkg/installed/x64-linux/include/boost/asio/execution/any_executor.hpp:1400:66:   required by substitution of ‘template<class Executor> boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > >::any_executor(Executor, typename std::enable_if<typename std::conditional<((! std::is_same<Executor, boost::asio::execution::any_executor<boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> > > >::value) && (! std::is_base_of<boost::asio::execution::detail::any_executor_base, Executor>::value)), boost::asio::execution::detail::is_valid_target_executor<Executor, void(boost::asio::execution::context_as_t<boost::asio::execution_context&>, boost::asio::execution::detail::blocking::never_t<0>, boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0> >, boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0> >)>, std::integral_constant<bool, false> >::type::value, void>::type*) [with Executor = boost::asio::io_service]’
/usr/include/boost/process/detail/posix/io_service_ref.hpp:125:63:   required from here
/usr/include/c++/10/type_traits:1412:38: error: invalid use of incomplete type ‘class boost::asio::io_service’
 1412 |     : public integral_constant<bool, __is_base_of(_Base, _Derived)>
      |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/boost/process/detail/traits.hpp:11,
                 from /usr/include/boost/process/async.hpp:32,
                 from /usr/include/boost/process.hpp:23,
                 from ../src/ExternalProcessUtils.cpp:4:
/usr/include/boost/process/detail/traits/async.hpp:15:7: note: forward declaration of ‘class boost::asio::io_service’
   15 | class io_service;
      |       ^~~~~~~~~~
...

I cut the remaining error message off since it is quite lengthy. Since my code seems to look fine I wonder if this is a bug in Boost. I'm using the newest version 1.75.0 but this problem also occurred in version 1.74.0 (hence the reason why I updated).

Any ideas on how this could be fixed?

0

There are 0 answers