G++ 包含 FreeBSD 上的路径

g++ include paths on freebsd

本文关键字:路径 FreeBSD 包含 G++      更新时间:2023-10-16

我在 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++ 中的一个错误,让 GCC 进入 C++11 模式以在 FreeBSD 上运行但是,即使按照 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194929 中的建议使用-D_GLIBCXX_USE_C99不能解决数学函数的问题。

最奇怪的是,我可以编译任何其他 C++11 函数,而不是从 <cmath> ,比如 std::stol ,但必须使用 -D_GLIBCXX_USE_C99 标志,如上面的错误报告中提到的。

知道如何在 FreeBSD 10.1 上使 g++ 与 C++11 完全功能吗?

它在 10.1 上开箱即用,您不需要任何黑客。当然,它仅适用于 -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 兼容性问题。