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

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

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

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

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

我决定按照示例 provided by openCV 使用 cmake 编译它.我的程序 (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})

https://stackoverflow.com/questions/70839553/

相关文章:

rust - 您可以在正在构建的结构中引用先前初始化的字段吗?

postgresql - GROUP BY 时前两个值的差异

python - 如何使用 pybind11 从 C++ 调用 python 函数?

flutter - 如何修复此语法错误?不可为 null 的实例字段 'students' 必须初始

python - 有没有办法用mypy覆盖python中继承的类属性类型?

python-3.x - 跳过大型 XML 文件中的元素(python 3)

julia - JuMP 非线性优化约束被打破到 O(1e-9)

pine-script - 如何在版本 5 中使用多个指标 ()

r - 假阳性与假阴性权衡图

typescript - 如何在 Typescript 中使用 Chai expect() 验证特定