g ++包含freebsd上的路径

时间:2015-02-09 17:01:01

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

我在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附带的旧的include文件,而不是gcc

中新的/usr/local/lib/gcc49/include对应的文件

我尝试将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函数而不是 <cmath>,例如std::stol,但必须使用-D_GLIBCXX_USE_C99上面的错误报告中提到的标志。

任何想法如何在FreeBSD 10.1上使用C ++ 11使g ++完全正常运行?

1 个答案:

答案 0 :(得分:1)

它在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兼容性问题。