Ubuntu22.04下VCPKG安装OpenCV失败:ninja子命令出错
问题:Ubuntu 22.04下VCPKG构建OpenCV依赖GTK3失败
环境:Ubuntu 22.04,CMake和VCPKG均为2024年1月安装的最新版本,项目在Windows下运行正常,但Ubuntu构建时出错。
项目配置文件
CMakeLists.txt
cmake_minimum_required (VERSION 3.20) if (DEFINED ENV{VCPKG_ROOT}) File(TO_CMAKE_PATH $ENV{VCPKG_ROOT} VCPKG_ROOT) message(STATUS ${VCPKG_ROOT}) if(WIN32) set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "") set(VCPKG_TARGET_TRIPLET "x64-windows-static" CACHE STRING "") else(WIN32) set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "" FORCE) set(VCPKG_TARGET_TRIPLET "x64-linux" CACHE STRING "") endif(WIN32) set(VCPKG_AVALIABLE TRUE) else (DEFINED ENV{VCPKG_ROOT}) message(WARNING "VCPKG_ROOT is not defined, OpenCV will not be used.") set(VCPKG_AVALIABLE FALSE) endif() project (test) if (MSVC) add_definitions (-D_USE_MATH_DEFINES) add_definitions(/MP) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ot /openmp" ) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<$<CONFIG:Debug>:Debug>>") endif() set(CXX_STANDARD 20) enable_language(C) enable_language(CXX) if(VCPKG_AVALIABLE) set(OpenCV_STATIC, ON) FIND_PACKAGE(OpenCV REQUIRED) add_definitions (-D_USE_OPENCV) endif(VCPKG_AVALIABLE) add_executable(test main.cpp}) target_include_directories(test PUBLIC ${OpenCV_INCLUDE_DIRS}) TARGET_LINK_LIBRARIES(test ${OpenCV_LIBS})
vcpkg.json
{ "dependencies": [ { "name": "opencv" } ] }
构建脚本
#!/bin/bash cmake -B./build -S./ cd build make
错误信息
初始构建错误
ninja: build stopped: subcommand failed.
VCPKG安装日志(vcpkg-manifest-install.log)
Detecting compiler hash for triplet x64-linux... The following packages will be built and installed: * flatbuffers:x64-linux@23.5.26#1 * gtk3:x64-linux@3.24.38#1 opencv[core,default-features]:x64-linux@4.8.0#1 * opencv4[core,default-features,dnn,gtk,jpeg,png,quirc,tiff,webp]:x64-linux@4.8.0#15 * protobuf:x64-linux@3.21.12#1 * vcpkg-get-python-packages:x64-linux@2024-01-02 Additional packages (*) will be modified to complete this operation. Restored 0 package(s) from /home/mans/.cache/vcpkg/archives in 25.4 us. Use --debug to see more details. Installing 1/6 gtk3:x64-linux@3.24.38#1... Building gtk3:x64-linux@3.24.38#1... -- Using cached GNOME-gtk-3.24.38.tar.gz. -- Cleaning sources at /home/mans/local/vcpkg/buildtrees/gtk3/src/3.24.38-f430748213.clean. Use --editable to skip cleaning for the packages you specify. -- Extracting source /home/mans/local/vcpkg/downloads/GNOME-gtk-3.24.38.tar.gz -- Applying patch 0001-build.patch -- Applying patch cairo-cpp-linkage.patch -- Using source at /home/mans/local/vcpkg/buildtrees/gtk3/src/3.24.38-f430748213.clean -- Getting CMake variables for x64-linux-dbg -- Getting CMake variables for x64-linux-rel -- Configuring x64-linux-dbg -- Configuring x64-linux-dbg done -- Configuring x64-linux-rel -- Configuring x64-linux-rel done -- Package x64-linux-dbg CMake Error at scripts/cmake/vcpkg_execute_required_process.cmake:112 (message): Command failed: /home/mans/local/vcpkg/downloads/tools/ninja/1.10.2-linux/ninja install -v Working Directory: /home/mans/local/vcpkg/buildtrees/gtk3/x64-linux-dbg Error code: 1 See logs for more information: /home/mans/local/vcpkg/buildtrees/gtk3/package-x64-linux-dbg-out.log Call Stack (most recent call first): scripts/cmake/vcpkg_install_meson.cmake:33 (vcpkg_execute_required_process) ports/gtk3/portfile.cmake:79 (vcpkg_install_meson) scripts/ports.cmake:170 (include) error: building gtk3:x64-linux failed with: BUILD_FAILED Elapsed time to handle gtk3:x64-linux: 11 s Please ensure you're using the latest port files with `git pull` and `vcpkg update`. Then check for known issues at: https://github.com/microsoft/vcpkg/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+gtk3 You can submit a new issue at: https://github.com/microsoft/vcpkg/issues/new?title=[gtk3]+Build+error+on+x64-linux&body=Copy+issue+body+from+%2Fhome%2Fmans%2FMyData%2FBitBucket%2Ftest%2Fvcpkg%2Fbuild%2Fvcpkg_installed%2Fvcpkg%2Fissue_body.md
GTK3构建日志(package-x64-linux-dbg-out.log)
[1/906] /home/mans/MyData/BitBucket/test/vcpkg/build/vcpkg_installed/x64-linux/tools/glib/glib-compile-resources gdk/gdk.gresource.xml --sourcedir ../src/3.24.38-f430748213.clean/gdk/. --sourcedir ../src/3.24.38-f430748213.clean/gdk --c-name _gdk --internal --generate --target gdk/gdkresources.c --manual-register --dependency-file gdk/gdkresources.c.d multipress.so.p/gtkimcontextmultipress.c.o -c ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.c ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.c: In function ‘on_timeout’: ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.c:204:3: warning: ‘gdk_threads_enter’ is deprecated [-Wdeprecated-declarations] 204 | gdk_threads_enter (); | ^~~~~~~~~~~~~~~~~ In file included from ../src/3.24.38-f430748213.clean/gdk/gdk.h:61, from ../src/3.24.38-f430748213.clean/gtk/gtk.h:30, from ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.h:20, from ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.c:20: ../src/3.24.38-f430748213.clean/gdk/gdkthreads.h:46:10: note: declared here 46 | void gdk_threads_enter (void); | ^~~~~~~~~~~~~~~~~ ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.c:214:3: warning: ‘gdk_threads_leave’ is deprecated [-Wdeprecated-declarations] 214 | gdk_threads_leave (); | ^~~~~~~~~~~~~~~~~ In file included from ../src/3.24.38-f430748213.clean/gdk/gdk.h:61, from ../src/3.24.38-f430748213.clean/gtk/gtk.h:30, from ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.h:20, from ../src/3.24.38-f430748213.clean/modules/input/gtkimcontextmultipress.c:20: ../src/3.24.38-f430748213.clean/gdk/gdkthreads.h:48:10: note: declared here 48 | void gdk_threads_leave (void); | ^~~~~~~~~~~~~~~~~ [312/906] /usr/bin/python3 /home/mans/MyData/BitBucket/test/vcpkg/build/vcpkg_installed/x64- Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=empty-body -Werror=write-strings -MD -MQ gdk/libgdk-3.a.p/gdkwindow.c.o -MF gdk/libgdk-3.a.p/gdkwindow.c.o.d -o gdk/libgdk-3.a.p/gdkwindow.c.o -c ../src/3.24.38-f430748213.clean/gdk/gdkwindow.c ninja: build stopped: subcommand failed.
解决方案
方案1:跳过GTK3依赖(推荐,若不需要OpenCV GUI功能)
OpenCV默认依赖GTK3,但如果你的项目不需要图像显示等GUI功能,可以修改vcpkg.json,指定只安装OpenCV的核心及必要特征,避免拉取GTK3:
{ "dependencies": [ { "name": "opencv", "features": ["core", "jpeg", "png"] } ] }
修改后删除原build目录,重新运行构建脚本即可。
方案2:修复GTK3构建问题(若需要GUI功能)
- 更新VCPKG:执行以下命令确保port文件和工具链是最新的:
vcpkg update vcpkg upgrade
- 安装系统依赖库:Ubuntu下构建GTK3需要额外的系统开发包,执行:
sudo apt-get update sudo apt-get install libx11-dev libxext-dev libxrender-dev libxinerama-dev libxcursor-dev libxi-dev libxrandr-dev libgtk-3-dev
- 清理缓存后重建:删除项目的build目录和VCPKG的缓存,重新运行构建脚本:
rm -rf build rm -rf ~/.cache/vcpkg/archives ./你的构建脚本.sh
方案3:修正CMakeLists.txt的小错误
CMakeLists.txt中set(OpenCV_STATIC, ON)多了一个逗号,这会导致变量设置错误,修正为:
set(OpenCV_STATIC ON)
虽然这不是当前构建失败的直接原因,但修正后能避免后续潜在问题。
内容的提问来源于stack exchange,提问作者mans
相关产品推荐
相关产品推荐

