Clion+vcpkg配置opencv+zbar实现C++条码检测

版本集成了vcpkg包管理,很好用,但也很多坑,调试了一天半的时间,基本上搞通了,记录一下 。
首先Clion创建新项目study,在左侧,找到vcpkg的按钮 。
点击,然后会出现在界面的左下侧
第一次使用会提示下载 。如果是想要全局使用,就安装到其他硬盘,如果每个项目单独配置,建议安装在项目的根目录(类似于/pip 虚拟环境全局环境) 。我自己的配置如下图 。
然后,可以愉快的通过vcpkg安装包了 。但是!!!第一个坑就来了 。齿轮这里的自动更改一定要取消掉 。
原因在于:vcpkg有两种操作方式 。一个类似于中的.txt安装(vcpkg.json),一个类似于pip手动安装 。但是Clion过于灵活,容易这两个同时进行,就成大坑了 。
因为vcpkg的第一种方法,是自己把包的版本号之类的配置信息写在vcpkg.json中,通过命令自动根据json文件下载,一旦通过这个方式,就不能再自己单独安装了(不能./vcpkgXXX 以及Clion一键安装),否则会报错,会提示安装失败,或者就是包链接不成功 。
建议用Clion集成的方法,搜索并点击安装键安装,这样方便 。同时,出现了第二个坑,不要点击添加到vcpkg.json,理由同上,不要让项目中出现vcpkg.json 。第三个坑,一定一定这个编译环境(三元组)选择要对应的上 设置中 工具链的架构!
一定要和上图三元组对应上,否则程序会链接失败
我用的msvc,x64那就和x64-对应上,一定要对应上 。比如安装zbar(-zbar)时,会默认安装x32位的,一定要注意 。
其他的就是小坑了 。比如工作目录要对应上:
CMake要加上(Clion会默认添加):例如“E=C:\Users\62359\\study\vcpkg\\\vcpkg.cmake”
针对于我这个,把vcpkg安装到单独的项目下的情况,在.txt中,设置一下路径 。
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"CACHE STRING "Vcpkg toolchain file")
总体的.txt编写:
cmake_minimum_required(VERSION 3.25)project(study)set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"CACHE STRING "Vcpkg toolchain file")set(CMAKE_CXX_STANDARD 20)add_executable(study main.cpp)set(OpenCV_DIR "${VCPKG_INSTALLED_DIR}/x64-windows/share/opencv4")find_package(OpenCV REQUIRED)include_directories(${OpenCV_INCLUDE_DIRS})target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})set(ZBAR_INCLUDE_DIRS ${_VCPKG_INSTALLED_DIR}/x64-windows/include)set(ZBAR_LIBRARIES ${_VCPKG_INSTALLED_DIR}/x64-windows/lib/zbar.lib)include_directories(${ZBAR_INCLUDE_DIRS})target_link_libraries(${PROJECT_NAME} PRIVATE ${ZBAR_LIBRARIES})
这里第四个大坑!有的库例如,vcpkg做了适配,能直接( ) 。
但是,像zbar就没有适配,如果写了,会报错:
Could not find afileby "ZBAR" with any of thenames:.cmake zbar-.cmake
这是因为没适配,导致没有cmake配置文件 。这样只能自己去写路径了 。照着我的写就好了 。
【Clion+vcpkg配置opencv+zbar实现C++条码检测】最后给一个demo:
#include #include #include #include namespace fs = std::filesystem;int main(){//std::cout << "Current working directory is " << fs::current_path() << std::endl;cv::Mat image;zbar::ImageScanner scanner;// 启用所有的条码检测scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);try{image = cv::imread("image/fact.jpg", cv::IMREAD_GRAYSCALE);zbar::Image zbar_image(image.cols, image.rows, "Y800", image.data, image.cols * image.rows); // 创建zbar::Image对象int num_symbols = scanner.scan(zbar_image);std::cout