【问题标题】:Are some libraries in Boost 1.69 not compatible with MacOS?Boost 1.69 中的某些库是否与 MacOS 不兼容?
【发布时间】:2019-07-21 12:37:40
【问题描述】:

我正在尝试编译一个在 Ubuntu 18.04 和 Windows 10 上编译没有问题的程序。但是,当我尝试在 OSX High Sierra 上编译它时,我得到了错误,它们仅与 boost 有关。

这是一个例子:

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

int main()
{
  std::cout << "This is a test." << std::endl;
}

然后我尝试使用g++clang 编译程序,如下所示:

g++ -std=c++11 test.cpp -lpthread

然后我得到这个巨大的错误:

In file included from test.cpp:1:
In file included from /usr/local/include/boost/process.hpp:24:
In file included from /usr/local/include/boost/process/async_system.hpp:22:
In file included from /usr/local/include/boost/process/child.hpp:21:
In file included from /usr/local/include/boost/process/detail/child_decl.hpp:30:
/usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:60:7: error: expected unqualified-id
    ::sigemptyset(&sigset);
      ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/signal.h:125:26: note: expanded from macro 'sigemptyset'
#define sigemptyset(set)        (*(set) = 0, 0)
                                ^
In file included from test.cpp:1:
In file included from /usr/local/include/boost/process.hpp:24:
In file included from /usr/local/include/boost/process/async_system.hpp:22:
In file included from /usr/local/include/boost/process/child.hpp:21:
In file included from /usr/local/include/boost/process/detail/child_decl.hpp:30:
/usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:61:7: error: expected unqualified-id
    ::sigaddset(&sigset, SIGCHLD);
      ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/signal.h:122:31: note: expanded from macro 'sigaddset'
#define sigaddset(set, signo)   (*(set) |= __sigbits(signo), 0)
                                ^
In file included from test.cpp:1:
In file included from /usr/local/include/boost/process.hpp:24:
In file included from /usr/local/include/boost/process/async_system.hpp:22:
In file included from /usr/local/include/boost/process/child.hpp:21:
In file included from /usr/local/include/boost/process/detail/child_decl.hpp:30:
/usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:87:26: error: no member named 'sigtimedwait' in the global namespace
        auto ret_sig = ::sigtimedwait(&sigset, nullptr, &ts);
                       ~~^
In file included from test.cpp:1:
In file included from /usr/local/include/boost/process.hpp:25:
In file included from /usr/local/include/boost/process/group.hpp:32:
/usr/local/include/boost/process/detail/posix/wait_group.hpp:64:7: error: expected unqualified-id
    ::sigemptyset(&sigset);
      ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/signal.h:125:26: note: expanded from macro 'sigemptyset'
#define sigemptyset(set)        (*(set) = 0, 0)
                                ^
In file included from test.cpp:1:
In file included from /usr/local/include/boost/process.hpp:25:
In file included from /usr/local/include/boost/process/group.hpp:32:
/usr/local/include/boost/process/detail/posix/wait_group.hpp:65:7: error: expected unqualified-id
    ::sigaddset(&sigset, SIGCHLD);
      ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/signal.h:122:31: note: expanded from macro 'sigaddset'
#define sigaddset(set, signo)   (*(set) |= __sigbits(signo), 0)
                                ^
In file included from test.cpp:1:
In file included from /usr/local/include/boost/process.hpp:25:
In file included from /usr/local/include/boost/process/group.hpp:32:
/usr/local/include/boost/process/detail/posix/wait_group.hpp:90:17: error: no member named 'sigtimedwait' in the global namespace
        ret = ::sigtimedwait(&sigset, nullptr, &ts);
              ~~^
6 errors generated.

我可能缺少编译器标志,我尝试过-lboost_system,但给出了相同的错误。如果这个特定的库与 OSX 不兼容,那么我会尝试找到一个解决方法,但是这个库已经嵌入到我当前正在使用的代码中。

是否有任何已知的解决方法?

【问题讨论】:

  • 据我所知,我相信我是。我怎样才能确定?我跑了grep BOOST_LIB_VERSION /usr/local/include/boost/version.hpp,我回来了#define BOOST_LIB_VERSION "1_69"@CinderBiscuits
  • @G.M.我将#include &lt;csignal&gt; 放在boost 包含之前,我仍然有同样的错误。我应该在csignal 中包含链接器标志吗?
  • 试试clang++ -std=c++11 test.cpp -lpthread -lc++ 你不应该链接任何特定于boost的东西,因为Boost.Process是一个只有头文件的库,但你需要链接到标准库,它要么是libc++要么是libstdc++ . (分别为-lc++-lstdc++。)
  • @CinderBiscuits 尝试了推荐的标志,但我仍然得到同样的错误。我什至重新安装了 boost,以确保我安装了 1.69.0。

标签: c++ macos boost


【解决方案1】:

你是对的。 As of 1.69.0 Boost.Process is broken on MacOS. 有关详细信息,请点击错误报告的链接。

错误报告中提供了一种解决方法,可以让它在 MacOS 上编译:

事实证明,MacOS 并不是唯一定义 sigemptysetsigaddset 的平台。这是一个简单的解决方法,因为您需要做的就是删除 :: 限定符。至于sigtimedwait,这在所有平台上也并不常见。奇怪的是,从那个中剥离 :: 限定符可以编译代码。我猜这个模板永远不会被实例化,所以方法没有退出的事实不会给我们带来问题。

我可以提供一个补丁,但它只不过是从这 3 个标识符中剥离 ::

包含一个综合补丁in the Flint project。请注意,如果您选择在代码中包含 Flint 的补丁,则 Flint 已获得 MIT 许可

【讨论】:

  • 谢谢,我会看看删除那些:: 是否会帮助这个程序至少编译。如果它足够糟糕,我将恢复到旧版本的 boost。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2016-08-22
  • 1970-01-01
  • 2012-02-13
  • 2016-10-21
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多