xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
10.11k stars 784 forks source link

xmake集成OpenCV不成功 #1086

Closed baby7305 closed 3 years ago

baby7305 commented 3 years ago

注:提问题时若使用不能用/没效果/有问题/报错此类模糊表达,但又没有根据下面的模板给出任何相关辅助信息的,将会直接标记为Invalid。

描述问题

xmake集成包管理器中的OpenCV不成功,编译不过 `#include

include <opencv2/opencv.hpp>

using namespace std; using namespace cv;

int main() { Mat srcImage = imread("./lianggongchunri_de_youyv-009.jpg"); if (!srcImage.data) { std::cout << "Image not loaded"; return -1; } imshow("[img]", srcImage); waitKey(0); // return 0; }`

`add_rules("mode.debug", "mode.release") -- add_requires("conan::opencv/4.5.0", {alias = "opencv", optional = true, debug = true}) -- add_requires("CONAN::zlib/1.2.11@conan/stable", {alias = "zlib", debug = true}) -- add_requires("CONAN::opencv/4.5.0@conan/stable", {alias = "opencv", debug = true}) -- add_requires("conan::opencv/4.5.0") add_requires("brew::opencv") -- add_requires("opencv")

target("xmake-opencv-app") set_kind("binary") set_languages("cxx14") add_includedirs("include") add_files("src/*.cpp") -- add_packages("opencv") add_packages("brew::opencv") -- add_packages("vcpkg::opencv3/4.3.0")

-- on_load(function (target)
--     target:add(find_packages("opencv4"))
-- end)`

`xmake -vDP [ 50%]: compiling.release src/main.cpp "/usr/bin/xcrun -sdk macosx clang" -c -Qunused-arguments -arch x86_64 -mmacosx-version-min=10.15 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++14 -Iinclude -isystem /usr/local/Cellar/opencv/4.5.0_5/include -o build/.objs/xmake-opencv-app/macosx/x86_64/release/src/main.cpp.o src/main.cpp error: @programdir/modules/private/async/runjobs.lua:210: @programdir/modules/private/action/build/object.lua:78: @programdir/modules/core/tools/gcc.lua:480: src/main.cpp:2:10: fatal error: 'opencv2/opencv.hpp' file not found

include <opencv2/opencv.hpp>

     ^~~~~~~~~~~~~~~~~~~~

1 error generated. stack traceback: [C]: in function 'error' [@programdir/core/base/os.lua:789]: in function 'raise' [@programdir/modules/core/tools/gcc.lua:480]: in function 'catch' [@programdir/core/sandbox/modules/try.lua:127]: in function 'try' [@programdir/modules/core/tools/gcc.lua:429]: [C]: in function 'compile' [@programdir/modules/private/action/build/object.lua:78]: in function 'script' [@programdir/modules/private/action/build/object.lua:91]: in function '_build_object' [@programdir/modules/private/action/build/object.lua:116]: in function 'jobfunc' [@programdir/modules/private/async/runjobs.lua:188]: [C]: in function 'trycall' [@programdir/core/sandbox/modules/try.lua:121]: in function 'try' [@programdir/modules/private/async/runjobs.lua:182]: in function 'cotask' [@programdir/core/base/scheduler.lua:317]:

stack traceback: [C]: in function 'error' @programdir/core/base/os.lua:789: in function 'raise' @programdir/modules/private/async/runjobs.lua:210: in function 'catch' @programdir/core/sandbox/modules/try.lua:127: in function 'try' @programdir/modules/private/async/runjobs.lua:182: in function 'cotask' @programdir/core/base/scheduler.lua:317: in function <@programdir/core/base/scheduler.lua:315> warning: target(xmake-opencv-app).add_includedirs("include") path not found at ./xmake.lua:12`

期待的结果

请尽量清晰精准地描述你所期待的结果。

错误信息

如果可能,请尽量附加程序运行过程中的错误输出信息。

如果是xmake相关编译问题,请加上-vD参数运行,并给出详细编译输出信息。

相关环境

请提供编译和运行环境信息,下面是一些必须填写的基础信息,便于我们针对性排查问题:

其他信息

请提供其他附加信息帮助我们诊断问题(比如截图,xmake.lua或者可复现的demo),以及你遇到的问题的一些背景信息。 image

waruqi commented 3 years ago

-isystem /usr/local/Cellar/opencv/4.5.0_5/include

我看到你这 opencv 的 include 路径已经在了,正常传入了编译器,如果 opencv2/opencv.hpp 还是没找到,那跟 xmake 关系不大, 你首先得到 /usr/local/Cellar/opencv/4.5.0_5/include 这个目录下确认 是否存在 opencv2/opencv.hpp,看下代码里面 include 的头文件路径是否不对

xq114 commented 3 years ago

装的opencv4,opencv2下面没东西是正常的吧

waruqi commented 3 years ago

装的opencv4,opencv2下面没东西是正常的吧

是否正常我不知道,我不怎么用opencv,反正 /usr/local/Cellar/opencv/4.5.0_5/include 里面有什么,就 include 用什么,这个是库的问题,可以先到 /usr/local/Cellar/opencv/4.5.0_5/include 里面找找 应该用哪个头文件,具体路径在哪里,然后决定怎么 include

baby7305 commented 3 years ago

目录是这样的

image

waruqi commented 3 years ago

既然有,那就针对性include下对应路径 #include <opencv4/opencv2/opencv.hpp> 不就好了么

baby7305 commented 3 years ago

xmake
[ 50%]: compiling.release src/main.cpp error: /usr/local/Cellar/opencv/4.5.0_5/include/opencv4/opencv2/opencv.hpp:48:10: fatal error: 'opencv2/opencv_modules.hpp' file not found

include "opencv2/opencv_modules.hpp"

     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

1 error generated. warning: target(xmake-opencv-app).add_includedirs("include") path not found at ./xmake.lua:12 可是OpenCV自己内部都引用不到

baby7305 commented 3 years ago

相同的代码我这边用clion cmake是能识别到opencv的。

waruqi commented 3 years ago

那这个没办法,homebrew 给到的 信息,只能检测到 /usr/local/Cellar/opencv/4.5.0_5/include 这个路径,要么你看下 brew 装的 opencv 下面有没有 多个子 pkgconfig 的 .pc 配置,通过 brew::pcre2/libpcre2-8 的方式指定子配置。。

要么你使用 add_requires("opencv") 装,这个包内部自动会给你追加 opencv4 这个子路径到 includes

waruqi commented 3 years ago

相同的代码我这边用clion cmake是能识别到opencv的。

cmake 的 find_package 内置脚本里面 比较丰富,内置了 find_opencv的写死的各种探测配置,这种方式是可以,但是会不断增加cmake自身包大小,且不好维护

虽然xmake也有内置的各种 find_xx 脚本,但是目前还没收录 find_opencv 做特殊处理,通常我们更建议走自动化的方式,自动适配,如果没匹配,就走 add_requires("opencv") 的内置仓库包。。

后期 对 find_opencv 等特殊处理脚本,后期也会不断完善,但这块维护起来工作量,所以目前收录的不是很多,回头有时间再改进。

waruqi commented 3 years ago

我这边用内置的 add_requires("opencv") 包测了下,并没什么问题,可以直接安装使用。

checking for Xcode directory ... /Applications/Xcode.app
checking for SDK version of Xcode ... 11.0
checking for Codesign Identity of Xcode ... Apple Development: waruqi@gmail.com (T3NA4MRVPU)
checking for /usr/bin/xcrun -sdk macosx clang ... ok
checking for flags (-fvisibility-inlines-hidden) ... ok
checking for flags (-O3) ... ok
checking for ccache ... /usr/local/bin/ccache
[ 50%]: ccache compiling.release src/main.cpp
/usr/local/bin/ccache /usr/bin/xcrun -sdk macosx clang -c -Qunused-arguments -arch x86_64 -mmaco
sx-version-min=10.15 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platf
orm/Developer/SDKs/MacOSX11.0.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -std=c++14
 -framework Foundation -framework CoreFoundation -framework CoreGraphics -framework AppKit -fram
ework OpenCL -isystem /Users/ruki/.xmake/packages/o/opencv/4.2.0/d639b7d6e3244216b403b39df5101ab
f/include/opencv4 -isystem /Users/ruki/.xmake/packages/o/openssl/1.1.1h/d639b7d6e3244216b403b39d
f5101abf/include -o build/.objs/opencv/macosx/x86_64/release/src/main.cpp.o src/main.cpp
checking for flags (-MMD -MF) ... ok
checking for flags (-fcolor-diagnostics) ... ok
[ 75%]: linking.release opencv
"/usr/bin/xcrun -sdk macosx clang++" -o build/macosx/x86_64/release/opencv build/.objs/opencv/ma
cosx/x86_64/release/src/main.cpp.o -arch x86_64 -mmacosx-version-min=10.15 -isysroot /Applicatio
ns/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk -stdlib=
libc++ -Wl,-x -L/Users/ruki/.xmake/packages/o/opencv/4.2.0/d639b7d6e3244216b403b39df5101abf/lib
-L/Users/ruki/.xmake/packages/o/openssl/1.1.1h/d639b7d6e3244216b403b39df5101abf/lib -lopencv_sal
iency -lopencv_photo -lopencv_bgsegm -lopencv_videoio -lopencv_quality -lopencv_surface_matching
 -lopencv_datasets -lopencv_dnn_objdetect -lopencv_calib3d -lopencv_xphoto -lopencv_features2d -
lopencv_img_hash -lopencv_dnn -lopencv_core -lopencv_rgbd -lopencv_plot -lopencv_freetype -lopen
cv_imgcodecs -lopencv_highgui -lopencv_fuzzy -lopencv_structured_light -lopencv_video -lopencv_t
racking -lopencv_superres -lopencv_reg -lopencv_gapi -lopencv_xobjdetect -lopencv_text -lopencv_
ml -lopencv_ccalib -lopencv_objdetect -lopencv_stereo -lopencv_videostab -lopencv_aruco -lopencv
_face -lopencv_stitching -lopencv_phase_unwrapping -lopencv_xfeatures2d -lopencv_ximgproc -lopen
cv_shape -lopencv_dnn_superres -lopencv_line_descriptor -lopencv_dpm -lopencv_flann -lopencv_hfs
 -lopencv_bioinspired -lopencv_imgproc -lopencv_optflow -lssl -lcrypto -framework Foundation -fr
amework CoreFoundation -framework CoreGraphics -framework AppKit -framework OpenCL -lz
[100%]: build ok!
ruki-2:opencv ruki$
waruqi commented 3 years ago

-isystem /Users/ruki/.xmake/packages/o/opencv/4.2.0/d639b7d6e3244216b403b39df5101ab f/include/opencv4

而且 opencv4 的子目录也会自动追加

waruqi commented 3 years ago

这个可以了么

waruqi commented 3 years ago

这里没啥问题 我先 close 了

mightbxg commented 3 years ago

@waruqi cmake 能直接通过 find_package 找到 OpenCV 不是因为 cmake 本身提供了 FindOpenCV.cmake 脚本,而是 OpenCV 这个工程是用 cmake 管理的,它在 install 的时候会自动生成并安装 OpenCVConfig.cmake 脚本,从而使 cmake 能直接找到。

能不能在 xmake 的 find_package 命令中支持查找 cmake 包呢?也就是查找并解析 Findxxx.cmake 或 xxxConfig.cmake 脚本。这个是可以通过调用 cmake --find-package ... 命令来实现的,它能查找一个包是否存在、包含路径有哪些、链接库有哪些。支持 cmake 包是一个特别实用的功能,毕竟目前非常多用户广泛的C++库是用 cmake 管理的。

另外,现在的 cmake 中 将 A 链接给 B 后,A 的 public 属性(包含路径、依赖项、编译选项等)会自动传递给 B,这样 B 就不需要重复设置这些属性了。比如一个可执行程序 demo 链接了 opencv_core 这个库(即target_link_library(demo PRIVATE opencv_core),那就不需要再制定 opencv 的包含路径了(即不需要 target_include_directories(demo PRIVATE ${OpenCV_INCLUDE_DIRS}))。这样的逻辑是很合理的,能简化用户使用包的代码,希望 xmake 能参考一下

waruqi commented 3 years ago

@waruqi cmake 能直接通过 find_package 找到 OpenCV 不是因为 cmake 本身提供了 FindOpenCV.cmake 脚本,而是 OpenCV 这个工程是用 cmake 管理的,它在 install 的时候会自动生成并安装 OpenCVConfig.cmake 脚本,从而使 cmake 能直接找到。

能不能在 xmake 的 find_package 命令中支持查找 cmake 包呢?也就是查找并解析 Findxxx.cmake 或 xxxConfig.cmake 脚本。这个是可以通过调用 cmake --find-package ... 命令来实现的,它能查找一个包是否存在、包含路径有哪些、链接库有哪些。支持 cmake 包是一个特别实用的功能,毕竟目前非常多用户广泛的C++库是用 cmake 管理的。

https://github.com/xmake-io/xmake/issues/1632

另外,现在的 cmake 中 将 A 链接给 B 后,A 的 public 属性(包含路径、依赖项、编译选项等)会自动传递给 B,这样 B 就不需要重复设置这些属性了。比如一个可执行程序 demo 链接了 opencv_core 这个库(即target_link_library(demo PRIVATE opencv_core),那就不需要再制定 opencv 的包含路径了(即不需要 target_include_directories(demo PRIVATE ${OpenCV_INCLUDE_DIRS}))。这样的逻辑是很合理的,能简化用户使用包的代码,希望 xmake 能参考一下

xmake 原本就支持 public ,add_packages("xxx", {public = true}) 其他 add_links defines 都支持 具体见文档

waruqi commented 3 years ago

@waruqi cmake 能直接通过 find_package 找到 OpenCV 不是因为 cmake 本身提供了 FindOpenCV.cmake 脚本,而是 OpenCV 这个工程是用 cmake 管理的,它在 install 的时候会自动生成并安装 OpenCVConfig.cmake 脚本,从而使 cmake 能直接找到。 能不能在 xmake 的 find_package 命令中支持查找 cmake 包呢?也就是查找并解析 Findxxx.cmake 或 xxxConfig.cmake 脚本。这个是可以通过调用 cmake --find-package ... 命令来实现的,它能查找一个包是否存在、包含路径有哪些、链接库有哪些。支持 cmake 包是一个特别实用的功能,毕竟目前非常多用户广泛的C++库是用 cmake 管理的。

见 #1632

大体搞完,可以看下 https://github.com/xmake-io/xmake/issues/1632#issuecomment-939926197 不过还有一些小坑

mightbxg commented 3 years ago

@waruqi cmake 能直接通过 find_package 找到 OpenCV 不是因为 cmake 本身提供了 FindOpenCV.cmake 脚本,而是 OpenCV 这个工程是用 cmake 管理的,它在 install 的时候会自动生成并安装 OpenCVConfig.cmake 脚本,从而使 cmake 能直接找到。 能不能在 xmake 的 find_package 命令中支持查找 cmake 包呢?也就是查找并解析 Findxxx.cmake 或 xxxConfig.cmake 脚本。这个是可以通过调用 cmake --find-package ... 命令来实现的,它能查找一个包是否存在、包含路径有哪些、链接库有哪些。支持 cmake 包是一个特别实用的功能,毕竟目前非常多用户广泛的C++库是用 cmake 管理的。

见 #1632

大体搞完,可以看下 #1632 (comment) 不过还有一些小坑

强啊👍🏻