c++ - g++ 在 freebsd 上包含路径

标签 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 附带的旧包含文件,而不是与新的 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 然而即使使用 -D_GLIBCXX_USE_C99正如 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194929 中所建议的那样 没有解决数学函数的问题。

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

知道如何在 FreeBSD 10.1 上使用 C++11 使 g++ 完全发挥作用吗?

最佳答案

它在 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 是从 ports 编译的,据报告包无法工作。可能是因为 10.1 的包在编写时是在 10.0 上编译的,它仍然存在 c++11 兼容性问题。

关于c++ - g++ 在 freebsd 上包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415149/

相关文章:

c++ - 为什么OpenGL立即模式比内核快?

multithreading - 类成员函数的静态互斥体 : C++ 11

c++ - 使用 "multiple"命名空间单行

c++ - Qt5 从 QNetworkReply 读取后没有波兰语字符

c++ - C++继承中,派生类如何禁用基类的某些元素(数据或函数)?

c - C 预处理器中指向 void 的指针

c - gcc:C 中未声明的变量,但已声明

ios - 知道编译 iOS 应用程序时 "dyld: Symbol not found: ___gcc_personality_sj0"是什么吗?

c++ - (int *) (&a[2]) 和 *(&a[2]) 之间的区别

c++ - 在 C++ 高效存储上,刷新文件策略