注意
Qt:5.10.1
libtorch:pytorch v1.0.1
gcc:5.4.0
在qtcreator中利用qmake使用v1.0.1正式版的libtorch,编译正常,但是module使用forword函数
c10::intrusive_ptr<c10::ivalue::Tuple> results = module->forward(inputs).toTuple();//.toTensor();
时会报segment error,即内存段错误,但是使用cmake编译正常情况下却可以运行。所以使用最新的第三方库的时候还是推荐使用Cmake,即使是用Qt,qmake有时还是会出现错误,但是毕竟Qt就支持Cmake,所以干脆直接使用cmake来得省心。
用cmake构建基于qt5,opencv,libtorch项目
基础教程,请参考用cmake构建基于qt5.8.0的qt5项目,再给个常见错误解决链接。
再给出我的Cmakelist.txt的源码:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(maskrcnn_benchmark_cppdemo)
#Set library path
set(OpenCV_DIR /home/shining/ProgramFiles/miniconda/envs/pytorch1.0//share/OpenCV)
set(CMAKE_PREFIX_PATH /home/shining/ProgramFiles/Qt5.10.1/5.10.1/gcc_64/lib/cmake/Qt5)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#set(RESOURCE_DIR resources/resources.qrc)
find_package(Qt5 REQUIRED Widgets Core Gui)
qt5_wrap_cpp( MOC mainwindow.h)
qt5_wrap_ui( UIC mainwindow.ui)
qt5_add_resources(RCC resources.qrc)
qt5_generate_moc(main.cpp main.moc)
set_target_properties(Qt5::Core Qt5::Gui PROPERTIES MAP_IMPORTED_CONFIG_COVERAGE "RELEASE")
file(GLOB_RECURSE CURRENT_HEADERS include/*.h libosa/inc/*.h libosa/inc/csl/*.h *.h )
file(GLOB CURRENT_SOURCES *.cpp utils/*.cpp libosa/src/osa/*.c)
include_directories(BEFORE libosa/inc libosa/inc/csl )
set(CMAKE_PREFIX_PATH /home/shining/ProgramFiles/miniconda/envs/pytorch1.0/lib/python3.6/site-packages/torch)
find_package(Torch REQUIRED NO_CMAKE_FIND_ROOT_PATH)
find_package (OpenCV REQUIRED NO_CMAKE_FIND_ROOT_PATH)
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "Caffe2 library status:")
message(STATUS " version: ${CAFFE2_VERSION}")
message(STATUS " libraries: ${Caffe2_MAIN_LIBS}")
message(STATUS " include path: ${CAFFE2_INCLUDE_DIRS}")
message(STATUS "Torch library status:")
message(STATUS " version: ${TORCH_VERSION}")
message(STATUS " libraries: ${TORCH_LIBRARIES}")
message(STATUS " include path: ${TORCH_INCLUDE_DIRS}")
include_directories( ${OpenCV_INCLUDE_DIRS} ${TORCH_INCLUDE_DIRS} include)
add_executable(traced_model_demo ${MOC} ${UIC} ${CURRENT_HEADERS} ${CURRENT_SOURCES} mainwindow.ui)
target_compile_features(traced_model_demo PUBLIC cxx_range_for)
target_link_libraries(traced_model_demo "${TORCH_LIBRARIES}" Qt5::Widgets Qt5::Core Qt5::Gui)
target_link_libraries(traced_model_demo "opencv_core" "opencv_highgui" "opencv_imgcodecs" "opencv_imgproc" "dl")
#注册jit custom ops
target_link_libraries(traced_model_demo -Wl,--no-as-needed /home/shining/Projects/work/maskrcnn-xray/maskrcnn_benchmark/csrc/custom_ops/cmake-build-release/libmaskrcnn_benchmark_customops.so)
这里面需要特别注意的是使用QT Gui的时候,
#设置Qt5的CmakeConfig路径
set(CMAKE_PREFIX_PATH /home/shining/ProgramFiles/Qt5.10.1/5.10.1/gcc_64/lib/cmake/Qt5)
#设置使能 moc ,uic,rcc
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#set(RESOURCE_DIR resources/resources.qrc)
# 查找Qt5
find_package(Qt5 REQUIRED Widgets Core Gui)
qt5_wrap_cpp( MOC mainwindow.h)
qt5_wrap_ui( UIC mainwindow.ui)
qt5_add_resources(RCC resources.qrc)
qt5_generate_moc(main.cpp main.moc)
.
.
.
#非常重要,不然会出现错误。。。
add_executable(traced_model_demo ${MOC} ${UIC} ${CURRENT_HEADERS} ${CURRENT_SOURCES} mainwindow.ui)
``