2016-04-28 4 views
3

Я на Ubuntu 14.04 и gcc 4.9.3. Я столкнулся с какой-то странной проблемой: когда я включаю оптимизацию O3, есть несколько «вызовов маловероятно, и размер кода будет расти [-Werror = inline]». В моем коде нет встроенного ключевого слова. Почему gcc inline оптимизирует код до такой степени, что он вызывает свои собственные предупреждения?gcc -O3 флаг вызывает -Winline "вызов маловероятен и размер кода будет расти" предупреждение

Очевидно, что отключение -Winline будет скомпилировано, но есть ли лучший способ решить эту проблему?

Библиотека, с которой я работаю, является облачной библиотекой Point Point, для полноты код показан ниже.

Мои 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}) 

test.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; 
} 

EDIT: обновление с сообщением об ошибке

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 
+0

На каких строках вы получаете эту ошибку? –

+0

@FabioTurati см. Недавно обновленное сообщение об ошибке – user3667089

+0

Кажется очевидным, что ошибки относятся к встроенным в код pcl, а не к вашим собственным. –

ответ

2

Использование классов/структур может иметь встроенные элементы, даже если это не указано в коде.

Например, pcl::TextureMesh структуры будет иметь неявный деструктор, который в соответствии со стандартом C++:

неявно объявлен деструктором является встроенным открытым членом своего класса.

+0

Я пошел в исходный код PCL и добавил пустой деструктор, и ошибка исчезла! Означает ли это, что мы всегда должны явно объявлять деструктора, чтобы избежать такого рода ошибок? – user3667089

+1

Нет. Я бы сказал, что '-Winline' следует использовать только для целей информации/устранения неполадок и, вероятно, не следует использовать с' -Werror'. –

+3

Примечание: Я думаю, вы можете заставить 'Winline' оставаться только предупреждением даже с' -Werror', добавив следующую опцию (вероятно, она должна появиться после опции '-Werror' в командной строке):' -Wno- ошибка = inline' –

2

См this, а также рассмотреть this answer.

GCC включает автоматический встраивание даже если нет inline ключевого слова на -O3 уровне оптимизации. Таким образом, по мере выпуска NathanOliver, в библиотеке PCL может быть мало вероятный код (к сожалению, я не знаком с ним). Я бы уменьшил уровень оптимизации до -O2 или отключил агрессивный inlining с fno-inline-functions.

+0

Я все еще получаю ту же ошибку с '-O2' и' fno-inline-functions'. Считаете ли вы, что это больше проблема PCL или проблема gcc? Я больше склонен к тому, что это проблема gcc, потому что она не должна оптимизировать код до такой степени, что вызывает его собственные предупреждения. – user3667089

+0

Я думаю, что это проблема PCL, в основном из-за чего [Michael Burr] (http://stackoverflow.com/a/36922349/2315604) только что указал. У вас все еще есть флаг '-Winline', не так ли? Удалите его, так как он всегда предупреждает всякий раз, когда * inlining * терпит неудачу (и он передаст это предупреждение флажкам * warnings errors *). –