【问题标题】:g++ include paths on freebsdg ++在freebsd上包含路径
【发布时间】:2021-05-12 08:36:10
【问题描述】:

我在 FreeBSD10.1 上安装了 gcc49。我正在尝试将其用于 C++11 开发。但是,每次我编译一些使用特定数学函数的 C++11 有效代码(是的,我使用 -std=c++11)时,它都会吐出错误,例如

error: std::round is not a member of std
/usr/include/math.h 

例如,这里:

#include <cmath>
#include <iostream>

int main()
{
    std::cout << std::round(10.1) << std::endl;
}

所以它似乎试图使用 FreeBSD 附带的旧包含文件,而不是与来自 /usr/local/lib/gcc49/include 的新 gcc 对应的那些文件

我尝试将CPLUS_INCLUDE_PATH 设置为/usr/local/lib/gcc49/include,但没有成功,系统仍然尝试搜索/usr/include

我看到这可能是 FreeBSD g++ 中的一个错误, Getting GCC in C++11 mode to work on FreeBSD 但是,即使按照https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194929 中的建议使用-D_GLIBCXX_USE_C99 不能解决数学函数的问题。

最奇怪的是我可以编译任何其他 C++11 函数不是来自 &lt;cmath&gt;,如 std::stol,但必须使用错误中提到的 -D_GLIBCXX_USE_C99 标志以上报告。

知道如何在 FreeBSD 10.1 上使用 C++11 使 g++ 完全正常运行吗?

【问题讨论】:

  • 你要C++11吗?
  • @Deduplicator 是的,我需要 C++11 支持
  • @mvw,我试过了,同样的问题,似乎无法识别 C++11 标准库的数学部分
  • @vsoftco round 不是std 的成员。在没有std:: 的情况下使用它。它可能是 GCC 扩展。

标签: c++ c++11 gcc freebsd


【解决方案1】:

它在 10.1 上开箱即用,您不需要任何 hack。当然,它只适用于 -std=c++11,因为 std::round 仅从 11 标准开始可用(参见 http://en.cppreference.com/w/cpp/numeric/math/round)。

$ freebsd-version -ku
10.1-RELEASE
10.1-RELEASE
$ cat test.cc
#include <cmath>
#include <iostream>

int main() {
    std::cout << std::round(10.1) << std::endl;
}
$ g++5 -std=c++11 -o test test.cc
$ ./test
10

注意:gcc 是从端口编译的,包被报告为不起作用。可能是因为 10.1 的包在撰写本文时是在 10.0 上编译的,这仍然存在 c++11 兼容性问题。

【讨论】:

  • 对不起,我用 gcc5 标记了问题,但我使用了 gcc49。将尝试 gcc5。
  • 我刚刚在 VirtualBox 中使用了最新的稳定 10.1/amd64 版本(从 FreeBSD 的网站 freebsd.org/where.html 下载了安装程序映像),并使用 pkg install lang/gcc49 安装了 g++49。上面的代码没有编译。你是怎么安装编译器的?我没有从源代码编译它。
  • 我从端口构建一切。软件包可能会被破坏,因为它们是基于 10.0 构建的。
  • 谢谢,然后我应该编译端口。我使用pkg install 快​​速对其进行了测试,因为我只是想看看我的应用程序在 FreeBSD 上是否可移植且没有问题。您应该在答案中提到您使用了端口,因为使用 pkg install 似乎不起作用。
猜你喜欢
  • 2011-09-02
  • 2012-08-10
  • 2015-01-05
  • 2021-11-24
  • 2011-01-08
  • 2016-04-01
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多