c++;vtk:hello world仅在发行版的运行时失败 < >我将Hello World代码复制到我的主要C++中,希望能够逐个修改它,以便慢慢地创建我的渲染。我能够在发布和调试模式下编译它。但当我运行它时,它在调试时工作,在发布时失败。我得到一个分段错误

c++;vtk:hello world仅在发行版的运行时失败 < >我将Hello World代码复制到我的主要C++中,希望能够逐个修改它,以便慢慢地创建我的渲染。我能够在发布和调试模式下编译它。但当我运行它时,它在调试时工作,在发布时失败。我得到一个分段错误,c++,release,vtk,fedora-25,C++,Release,Vtk,Fedora 25,我的设置是netbeans中的一个cmake项目。我的CMakeList.txt如下所示: cmake_minimum_required(VERSION 3.6) project(uvlm) set(CMAKE_CXX_STANDARD 14) set(SOURCE_FILES ... hidden for clarity ...) include_directories(. ${EIGEN_LIBRARY_PATH} ${GITREPO_PATH}/

我的设置是netbeans中的一个cmake项目。我的CMakeList.txt如下所示:

cmake_minimum_required(VERSION 3.6)
project(uvlm)

set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES
   ... hidden for clarity ...)

include_directories(.
        ${EIGEN_LIBRARY_PATH}
        ${GITREPO_PATH}/hydros-mathlibrary/HydrosTools/UsefullCppFcts
        ${GITREPO_PATH}/hydros-mathlibrary/HydrosMathLibraryCode/Include/
        )

if(CMAKE_BUILD_TYPE MATCHES "Debug")
    set(EXECUTABLE_OUTPUT_PATH ${GITREPO_PATH}/hydros-uvlm/uvlm/Debug/bin)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -std=c++14 -D__LINUX__ ")
elseif(CMAKE_BUILD_TYPE MATCHES "Profiling")
    set(EXECUTABLE_OUTPUT_PATH ${GITREPO_PATH}/hydros-uvlm/uvlm/Profiling/bin)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -std=c++14 -D__LINUX__ ")
else()
    set(EXECUTABLE_OUTPUT_PATH ${GITREPO_PATH}/hydros-uvlm/uvlm/Release/bin)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -std=c++14 -D__LINUX__ ")
endif()

# DEBUG LIBRARIES
find_library(GTE_DEBUG_CXX_LIBRARY NAMES libgtengine.a HINTS ${GITREPO_PATH}/hydros-mathlibrary/HydrosMathLibraryCode/lib/Debug)
find_library(USEFULFCTS_DEBUG_CXX_LIBRARY NAMES libusefulfcts.a HINTS ${GITREPO_PATH}/hydros-mathlibrary/HydrosTools/UsefullCppFcts/lib/Debug)
# RELEASE LIBRARIES
find_library(GTE_RELEASE_CXX_LIBRARY NAMES libgtengine.a HINTS ${GITREPO_PATH}/hydros-mathlibrary/HydrosMathLibraryCode/lib/Release)
find_library(USEFULFCTS_RELEASE_CXX_LIBRARY NAMES libusefulfcts.a HINTS ${GITREPO_PATH}/hydros-mathlibrary/HydrosTools/UsefullCppFcts/lib/Release)

FIND_PACKAGE( OpenMP)
if(OPENMP_FOUND)
    message("OPENMP FOUND")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
include_directories(SYSTEM ${OpenMP_INCLUDE_PATH})

find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

add_executable(uvlm ${SOURCE_FILES})
target_link_libraries(uvlm debug ${GTE_DEBUG_CXX_LIBRARY} ${USEFULFCTS_DEBUG_CXX_LIBRARY} ${VTK_LIBRARIES} optimized ${GTE_RELEASE_CXX_LIBRARY} ${USEFULFCTS_RELEASE_CXX_LIBRARY} ${OpenMP_CXX_LIBRARIES} ${VTK_LIBRARIES})
我的cmake命令行具有如下参数:

${CMAKE} -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${IDE_CC} -DCMAKE_CXX_COMPILER=${IDE_CXX} -DCMAKE_C_FLAGS_RELEASE="-O3  -DEIGEN_NO_DEBUG -march=native -mfpmath=sse -funroll-loops" -DCMAKE_CXX_FLAGS_RELEASE=" -O3 -mfpmath=sse -funroll-loops -DEIGEN_NO_DEBUG " -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DEIGEN_LIBRARY_PATH="HIDDENPATH" -DGITREPO_PATH="HIDDENPATH" .
我在Fedora 25上使用dnf安装了vtk:
vtk-devel-6.3.0-11.fc25.x86_64

我运行的代码如下:

void vtkRenderingTest(std::string fileName, bool mbdynInfiniteLoop) 
{
  // This creates a polygonal cylinder model with eight circumferential facets
  // (i.e, in practice an octagonal prism).
  vtkSmartPointer<vtkCylinderSource> cylinder =
    vtkSmartPointer<vtkCylinderSource>::New();
  cylinder->SetResolution(8);

  // The mapper is responsible for pushing the geometry into the graphics library.
  // It may also do color mapping, if scalars or other attributes are defined.
  vtkSmartPointer<vtkPolyDataMapper> cylinderMapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
  cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

  // The actor is a grouping mechanism: besides the geometry (mapper), it
  // also has a property, transformation matrix, and/or texture map.
  // Here we set its color and rotate it around the X and Y axes.
  vtkSmartPointer<vtkActor> cylinderActor =
    vtkSmartPointer<vtkActor>::New();
  cylinderActor->SetMapper(cylinderMapper);
  cylinderActor->GetProperty()->SetColor(1.0000, 0.3882, 0.2784);
  cylinderActor->RotateX(30.0);
  cylinderActor->RotateY(-45.0);

  // The renderer generates the image
  // which is then displayed on the render window.
  // It can be thought of as a scene to which the actor is added
  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderer->AddActor(cylinderActor);
  renderer->SetBackground(0.1, 0.2, 0.4);
  // Zoom in a little by accessing the camera and invoking its "Zoom" method.
  renderer->ResetCamera();
  renderer->GetActiveCamera()->Zoom(1.5);

  // The render window is the actual GUI window
  // that appears on the computer screen
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->SetSize(200, 200);
  renderWindow->AddRenderer(renderer);

  // The render window interactor captures mouse events
  // and will perform appropriate camera or actor manipulation
  // depending on the nature of the events.
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // This starts the event loop and as a side effect causes an initial render.
  renderWindowInteractor->Start();

}

int main(int argc, char* argv[])
{
    try {

            // put the file name in the run property of the configurations (Release and Debug)
            bool mbdynInfiniteLoop = false;
//            if (argc > 2) { if (argv[2] == "true") { mbdynInfiniteLoop = true; } }
//            loadsEval(argv[1], mbdynInfiniteLoop);

            vtkRenderingTest("AAAA", true);

        return 0;
    }
    catch (std::string &e) {
        std::cout << "############### Error #####################\n\n";
        std::cout << e << std::endl;
        std::cout << "\n###########################################\n\n";
    }
    catch (hyd::HydExceptions &e) {
        std::cout << "############### Error #####################\n\n";
        std::cout << e.errMessage << std::endl;
        std::cout << "\n###########################################\n\n";

    }
}

`

以下对CMakeList.txt文件的修改使其运行。这是一个解决方案,但没有解释原因。如果有人能详细说明为什么这是一个解决方案,请这样做

我不得不改变连接图书馆的方式。因此,我删除了该行

target_link_libraries(uvlm debug ${GTE_DEBUG_CXX_LIBRARY} ${USEFULFCTS_DEBUG_CXX_LIBRARY} ${VTK_LIBRARIES} optimized ${GTE_RELEASE_CXX_LIBRARY} ${USEFULFCTS_RELEASE_CXX_LIBRARY} ${OpenMP_CXX_LIBRARIES} ${VTK_LIBRARIES})
把它改成了

if(CMAKE_BUILD_TYPE MATCHES "Debug")
    target_link_libraries(uvlm ${GTE_DEBUG_CXX_LIBRARY} ${USEFULFCTS_DEBUG_CXX_LIBRARY} ${VTK_LIBRARIES})
else()
    target_link_libraries(uvlm ${GTE_RELEASE_CXX_LIBRARY} ${USEFULFCTS_RELEASE_CXX_LIBRARY} ${VTK_LIBRARIES})
endif()

如果您使用的是linux,那么您应该能够在valgrind之类的工具下运行示例代码,该工具应该指示您是否遇到了任何内存分配问题。这表示读/写未分配/释放的内存,这是
SEGV
@Petesh最常见的触发器:我这样做了,并在问题中提供了结果。感谢查看它似乎是由
glGetString(GL\u版本)
返回空指针引起的,这通常是由于未初始化opengl引起的。是否引发了同样的问题?如果是这样,那么在尝试运行代码解决问题之前,您可能需要手动创建openGL上下文。我对cmake中找不到的glut库有一个问题(找不到glut_Xmu_库)。我记得我在一台Fedora 25机器上工作,wayland正在运行。然而,既然在调试版本中一切正常,我怎么能让vtk相信我们处于调试模式呢?
if(CMAKE_BUILD_TYPE MATCHES "Debug")
    target_link_libraries(uvlm ${GTE_DEBUG_CXX_LIBRARY} ${USEFULFCTS_DEBUG_CXX_LIBRARY} ${VTK_LIBRARIES})
else()
    target_link_libraries(uvlm ${GTE_RELEASE_CXX_LIBRARY} ${USEFULFCTS_RELEASE_CXX_LIBRARY} ${VTK_LIBRARIES})
endif()