gcc -O3 标志导致 -Winline "调用不太可能,代码大小会增长"警告
gcc -O3 flag causes -Winline "call is unlikely and code size would grow" warning
我在Ubuntu 14.04和gcc 4.9.3上。我遇到了一个奇怪的问题,当我启用O3优化时,会弹出一些"调用不太可能,代码大小会增长[-Weror=inline]"错误。我的代码中没有内联关键字。为什么gcc会对代码进行内联优化,从而触发自己的警告?
显然,禁用Winline会编译,但有更好的方法来解决这个问题吗?
我正在使用的库是Point Cloud库,为了完整起见,代码如下所示。
我的CMakeLists
cmake_minimum_required(VERSION 2.8)
project(Test)
set(PROJECT_SRCS
${PROJECT_SOURCE_DIR}/Test.cpp
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Werror -Winline")
# causes error
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
find_package( PCL 1.7 REQUIRED )
include_directories(${PCL_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} ${PROJECT_SRCS})
target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES})
测试.cpp
#include <string>
#include <vector>
#include "pcl/common/common_headers.h"
#include "pcl/io/obj_io.h"
#include "pcl/io/ply_io.h"
#include "pcl/io/vtk_lib_io.h"
#include "pcl/visualization/pcl_visualizer.h"
int main(){
pcl::TextureMesh mesh;
pcl::PointCloud<pcl::PointNormal> xyz;
pcl::PointNormal point1;
pcl::PointNormal point2;
pcl::PointNormal point3;
point1.x = 0;
point2.x = 1;
point3.x = 0;
point1.y = 0;
point2.y = 0;
point3.y = 1;
point1.z = 2;
point2.z = 2;
point3.z = 2;
xyz.push_back(point1);
xyz.push_back(point2);
xyz.push_back(point3);
pcl::toPCLPointCloud2(xyz, mesh.cloud);
std::vector<pcl::Vertices> mesh_poly;
std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > mesh_tex;
pcl::TexMaterial mesh_material;
pcl::Vertices v;
v.vertices.push_back(0);
v.vertices.push_back(1);
v.vertices.push_back(2);
mesh_poly.push_back(v);
Eigen::Vector2f tex1;
Eigen::Vector2f tex2;
Eigen::Vector2f tex3;
tex1(0) = -1.0;
tex1(1) = 0.0;
tex2(0) = -1.0;
tex2(1) = 1.0;
tex3(0) = 2.0;
tex3(1) = 0.0;
mesh_tex.push_back(tex1);
mesh_tex.push_back(tex2);
mesh_tex.push_back(tex3);
mesh_material.tex_file = "lena.png";
mesh_material.tex_name = "material_0";
mesh.tex_polygons.push_back(mesh_poly);
mesh.tex_coordinates.push_back(mesh_tex);
mesh.tex_materials.push_back(mesh_material);
pcl::io::saveOBJFile("out.obj", mesh);
return 0;
}
编辑:更新错误消息
In file included from /usr/local/include/pcl-1.8/pcl/io/obj_io.h:40:0,
from /home/david/test/Test.cpp:5:
/usr/local/include/pcl-1.8/pcl/TextureMesh.h: In function ‘int main()’:
/usr/local/include/pcl-1.8/pcl/TextureMesh.h:50:10: error: inlining failed in call to ‘pcl::TexMaterial::~TexMaterial()’: call is unlikely and code size would grow [-Werror=inline]
struct TexMaterial
^
/home/david/test/Test.cpp:37:20: error: called from here [-Werror=inline]
pcl::TexMaterial mesh_material;
^
In file included from /usr/local/include/pcl-1.8/pcl/io/obj_io.h:40:0,
from /home/david/test/Test.cpp:5:
/usr/local/include/pcl-1.8/pcl/TextureMesh.h:91:10: error: inlining failed in call to ‘pcl::TextureMesh::~TextureMesh()’: call is unlikely and code size would grow [-Werror=inline]
struct TextureMesh
^
/home/david/test/Test.cpp:14:20: error: called from here [-Werror=inline]
pcl::TextureMesh mesh;
^
In file included from /usr/local/include/pcl-1.8/pcl/io/obj_io.h:40:0,
from /home/david/test/Test.cpp:5:
/usr/local/include/pcl-1.8/pcl/TextureMesh.h:50:10: error: inlining failed in call to ‘pcl::TexMaterial::~TexMaterial()’: call is unlikely and code size would grow [-Werror=inline]
struct TexMaterial
^
/home/david/test/Test.cpp:37:20: error: called from here [-Werror=inline]
pcl::TexMaterial mesh_material;
^
In file included from /usr/local/include/pcl-1.8/pcl/io/obj_io.h:40:0,
from /home/david/test/Test.cpp:5:
/usr/local/include/pcl-1.8/pcl/TextureMesh.h:91:10: error: inlining failed in call to ‘pcl::TextureMesh::~TextureMesh()’: call is unlikely and code size would grow [-Werror=inline]
struct TextureMesh
^
/home/david/test/Test.cpp:14:20: error: called from here [-Werror=inline]
pcl::TextureMesh mesh;
^
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/Test.dir/Test.cpp.o] Error 1
make[1]: *** [CMakeFiles/Test.dir/all] Error 2
make: *** [all] Error 2
使用的类/结构可能具有内联成员,即使这在代码中不是显式的。
例如,pcl::TextureMesh
结构将有一个隐式析构函数,根据C++标准:
隐式声明的析构函数是其类的内联公共成员。
看看这个,也考虑一下这个答案。
即使在-O3
优化级别上没有inline
关键字,GCC也会启用自动内联。因此,正如NathanOliver所说,PCL库中可能存在不太可能调用的代码(不幸的是,我不熟悉它)。我会将优化级别降低到-O2
,或者禁用带有fno-inline-functions
的主动内联。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- GCC对可能有效的代码抛出init list生存期警告
- 返回语句后的代码,没有警告
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- Cmake:为 C 设置警告级别,并为 MSVC 单独设置C++代码(Visual C++)
- Clang 给了我符号更改的警告,但代码仍然产生正确的输出
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 如何在C++中禁用代码声纳警告
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- Cppcheck 静态代码分析器实际上可以检测到不太常见的警告(如 "Relative Path Traversal (CWE-23)" 或"Buffer Under-read(CWE-127)")吗
- 如何获取有关 Visual Studio 代码分析中未经检查的函数返回值的警告
- 在VS2017代码分析中抑制外部标头的警告
- 使用代码调整删除"comparison is always false"警告
- 我的代码错误类型警告 1 警告 C4018 和更多错误
- 我不想导出的函数的未记录代码对象警告
- 如何在代码块 IDE 上修复此警告,警告:按值 [-Wcatch-value=] 捕获多态类型"类 std::d omain_error"
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- snprintf:相同的代码-在不同的g++编译器上有不同的错误/警告
- 警告级别4中的不可访问代码警告
- 如何避免由于编译器错误而导致无法访问的代码警告