Eigen & GCC 5 : class std::binder2nd 已弃用
Eigen & GCC 5 : class std::binder2nd is deprecated
我刚刚重新开始一个搁置了几个月的项目。上次我编译它时它工作得很好,没有任何错误或警告。
然而,当我今天早些时候尝试编译它时,我收到了这个警告
attention : ‘template<class _Operation> class std::binder2nd’ is deprecated [-Wdeprecated-declarations]
当我在整个项目中使用 Eigen/Geometry 时,这个警告实际上出现了数百次
In file included from [...]/include/Eigen/src/Core/ArrayBase.h:109:0,
from [...]/include/Eigen/Core:350,
from [...]/include/Eigen/Geometry:4,
from [...]/include/[myproject]/types.hh:8,
from [...]/include/[myproject]/voronoi.hh:8
从那以后我就没有更新过Eigen(用的是3.2.4,今天还是最后一次更新)。
不过自从上次编译后,GCC已经更新到5.1.0了(我用的是archlinux)
问题:
- gcc 5.1.0 是否有问题告诉我 std::binder2nd 已被弃用
- 是否应该更新 Eigen?
- 如何在不丢失构建的冗长性的情况下消除那些特定的警告?
回答
我很高兴 std::bind2nd
确实被弃用了 a commit has been done to solve that in Eigen。但是,此提交尚未与主分支合并:/(并且没有解决问题,因为一些 std::bind2nd
仍然存在于 Eigen 的代码中)
底线是:Eigen 的最后一个稳定版本已弃用
不使用 -I
标志来包含文件,而是使用 -isystem
来包含 Eigen headers:
g++-5 -isystem/usr/include/eigen3 source_file_here.cpp
此标志适用于不符合 C
标准但在生成警告时被视为误报的系统 headers。 Eigen headers 的使用与系统 headers 非常相似,因此对于大多数用户来说,警告没有帮助,而只是令人讨厌的误报。
感谢 Ilya Popov 在原始问题中的评论。
- gcc 5.1.0 是否有问题告诉我 std::binder2nd 已被弃用
不,C++ 标准说它在 C++11 中已被弃用,因此如果您在 C++11 模式下编译,那么它应该被弃用。
- 是否应该更新 Eigen?
是的。如果它想与 C++17 兼容,因为 std::bind2nd
根本不存在 post-C++14。
- 如何在不丢失构建的冗长性的情况下消除那些特定的警告?
取消警告。在 command-line 上使用 -Wno-deprecated-declarations
进行编译,或者在包含 Eigen headers:
时在源代码中进行编译
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#include <eigen/whatever.h>
#pragma GCC diagnostic pop
或者,正如另一个答案所说,告诉 GCC 将 Eigen headers 视为系统 headers,如果它们在 /usr/include
中或被包含在内,这会自动发生-isystem
,或包含在另一个 header 中:
#pragma GCC system_header
#include <eigen/whatever.h>
How can I silent those specific warning without loosing the verbosity ?
编辑CMakeLists.txt 文件。在设置 CMAKE_CXX_FLAGS 后的某处添加此行。
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
之前的回答提到将其添加到#pragma 或命令行。我对#pragma 有偏见,因为我发现后来很难记住我把它放在哪里。所以作为一般做法,我尽量避免#pragma。添加到命令行意味着你必须记住每次重新编译时都要输入这个。
我刚刚重新开始一个搁置了几个月的项目。上次我编译它时它工作得很好,没有任何错误或警告。 然而,当我今天早些时候尝试编译它时,我收到了这个警告
attention : ‘template<class _Operation> class std::binder2nd’ is deprecated [-Wdeprecated-declarations]
当我在整个项目中使用 Eigen/Geometry 时,这个警告实际上出现了数百次
In file included from [...]/include/Eigen/src/Core/ArrayBase.h:109:0,
from [...]/include/Eigen/Core:350,
from [...]/include/Eigen/Geometry:4,
from [...]/include/[myproject]/types.hh:8,
from [...]/include/[myproject]/voronoi.hh:8
从那以后我就没有更新过Eigen(用的是3.2.4,今天还是最后一次更新)。 不过自从上次编译后,GCC已经更新到5.1.0了(我用的是archlinux)
问题:
- gcc 5.1.0 是否有问题告诉我 std::binder2nd 已被弃用
- 是否应该更新 Eigen?
- 如何在不丢失构建的冗长性的情况下消除那些特定的警告?
回答
我很高兴 std::bind2nd
确实被弃用了 a commit has been done to solve that in Eigen。但是,此提交尚未与主分支合并:/(并且没有解决问题,因为一些 std::bind2nd
仍然存在于 Eigen 的代码中)
底线是:Eigen 的最后一个稳定版本已弃用
不使用 -I
标志来包含文件,而是使用 -isystem
来包含 Eigen headers:
g++-5 -isystem/usr/include/eigen3 source_file_here.cpp
此标志适用于不符合 C
标准但在生成警告时被视为误报的系统 headers。 Eigen headers 的使用与系统 headers 非常相似,因此对于大多数用户来说,警告没有帮助,而只是令人讨厌的误报。
感谢 Ilya Popov 在原始问题中的评论。
- gcc 5.1.0 是否有问题告诉我 std::binder2nd 已被弃用
不,C++ 标准说它在 C++11 中已被弃用,因此如果您在 C++11 模式下编译,那么它应该被弃用。
- 是否应该更新 Eigen?
是的。如果它想与 C++17 兼容,因为 std::bind2nd
根本不存在 post-C++14。
- 如何在不丢失构建的冗长性的情况下消除那些特定的警告?
取消警告。在 command-line 上使用 -Wno-deprecated-declarations
进行编译,或者在包含 Eigen headers:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#include <eigen/whatever.h>
#pragma GCC diagnostic pop
或者,正如另一个答案所说,告诉 GCC 将 Eigen headers 视为系统 headers,如果它们在 /usr/include
中或被包含在内,这会自动发生-isystem
,或包含在另一个 header 中:
#pragma GCC system_header
#include <eigen/whatever.h>
How can I silent those specific warning without loosing the verbosity ?
编辑CMakeLists.txt 文件。在设置 CMAKE_CXX_FLAGS 后的某处添加此行。
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
之前的回答提到将其添加到#pragma 或命令行。我对#pragma 有偏见,因为我发现后来很难记住我把它放在哪里。所以作为一般做法,我尽量避免#pragma。添加到命令行意味着你必须记住每次重新编译时都要输入这个。