我可以用 g++ 编译,但得到一个具有等效 cmake 的错误程序(GTK 错误)

I can compile with g++ but get a buggy program with equivalent cmake (GTK error)

本文关键字:错误 cmake GTK 程序 一个 编译 g++ 我可以      更新时间:2024-09-30

我在main.cpp中有一个非常简单的程序,它用openCV显示图像。 我使用以下命令编译它:

g++ -o main main.cpp $(pkg-config opencv4 --cflags --libs)

pkg-config opencv4 --cflags --libs的输出在本问题的附录中提供。

然后程序完美运行,我可以在新窗口中看到我的.jpg文件。

我决定使用cmake编译它,遵循 openCV 提供的示例。我的程序(main.cpp)本质上是相同的。

所以我的CMakeLists.txt文件是:

cmake_minimum_required(VERSION 3.1)
project( main )
find_package( OpenCV REQUIRED )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -pthread")
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( main main.cpp )
target_link_libraries( main ${OpenCV_LIBS} )

我使用以下方法构建我的项目:

mkdir build
cd build
cmake ../
make

并启动程序,令我惊讶的是,该程序失败并出现以下错误:

terminate called after throwing an instance of 'cv::Exception'
what():  OpenCV(4.5.5-dev) ${ROOT_DIR_OF_MY_PROJECT}/opencv-4.x/modules/highgui/src/window.cpp:1251: error: (-2:Unspecified error) The function is not implemented.
Rebuild the library with Windows, GTK+ 2.x or Cocoa support.
If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config,
then re-run cmake or configure script in function 'cvNamedWindow'

其中ROOT_DIR_OF_MY_PROJECT是对应于我的main.cpp所在的../的完整路径。

我的问题

  • 为什么我的 cmake 会在这里执行与我的简单g++命令不同的操作,我该如何纠正它的行为?

请询问任何进一步的信息。

已试用

  • 更改了C++标准,强制cmake使用g++
  • 试图查看make -n发出的命令并复制它们以自己运行它们,但make -ncmake后给出了很多输出,所以我不明白到底发生了什么。

附录

pkg-config opencv4 --cflags --libs输出(换行以提高可读性):

-I/usr/include/opencv4/opencv -I/usr/include/opencv4 -lopencv_stitching
-lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib
-lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui
-lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs
-lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg
-lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light
-lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching 
-lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot
-lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_ximgproc
-lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d 
-lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto 
-lopencv_photo -lopencv_imgproc -lopencv_core

Dan Masek是绝对正确的!(见评论)

我没有链接到同一版本,这是我通过打印cmake尝试的包含目录看到的。请在下面找到更正后的CMakeLists.txt文件。

cmake_minimum_required(VERSION 3.1)
project( main )
# Links to the wrong version of openCV
# find_package( OpenCV REQUIRED )
find_package(PkgConfig REQUIRED)
pkg_check_modules(OpenCV REQUIRED opencv4)
# MESSAGE(${OpenCV_INCLUDE_DIRS})
# MESSAGE(${OpenCV_LIBRARIES})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -pthread")
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( main main.cpp )
target_link_libraries( main ${OpenCV_LIBRARIES})