ubuntu编译zxing-cpp踩坑
安装Qt
如果是系统没装Qt,就按照Qt5安装这个链接里面的内容安装,期间可能会遇到运行下面的命令
sudo apt-get install qt5*
时,报错can not locate qt*
,然后根据这个链接的内容,在.zshrc
或.bashrc
文件中加入下面一行
setopt no_nomatch
并source ~/.zshrc
或source ~/.bashrc
一下,再安装qt5*
就能成功
安装了Qt但报错找不到Qt
按照以上步骤安装了Qt但仍报错找不到的
INFO: Qt (Gui/Multimedia/Quick) not found, skipping Qt examples
-- Configuring done
CMake Warning (dev) in example/CMakeLists.txt:
AUTOGEN: No valid Qt version found for target ZXingOpenCV. AUTOMOC and
AUTORCC disabled. Consider adding:
find_package(Qt<QTVERSION> COMPONENTS Core)
to your CMakeLists.txt file.
This warning is for project developers. Use -Wno-dev to suppress it.
按照里面的提示,在zxing-cpp/CMakeLists.txt
中加入find_package(Qt<QTVERSION> COMPONENTS Core)
一行,其中的换成你的版本号,这里换成5
find_package(Qt5 COMPONENTS Core)
找不到stb
报错找不到stb这个package
-- Checking for module 'stb'
-- No package 'stb' found
-- Configuring done
-- Generating done
在各个CMakeLists.txt
文件中搜索stb
这个关键字,发现只有
zxing_add_package_stb()
这一行里面包含stb
这个关键字,再找,发现是在zxing-cpp/zxing.cmake
这个文件里面定义这条命令的。参考这个链接,发现zxing-cpp/zxing.cmake
下面这一串东西是已经做了搜索添加stb
包这个操作的,但最后却没生效,语句的作用看注释。
macro(zxing_add_package_stb)
unset (STB_FOUND CACHE)
if (BUILD_DEPENDENCIES STREQUAL "AUTO")
find_package(PkgConfig)
pkg_check_modules (STB IMPORTED_TARGET stb) # 检测stb包是否存在
elseif (BUILD_DEPENDENCIES STREQUAL "LOCAL")
find_package(PkgConfig REQUIRED)
pkg_check_modules (STB REQUIRED IMPORTED_TARGET stb)
endif()
if (NOT STB_FOUND) # 如果stb包找不到
include(FetchContent)
FetchContent_Declare (stb
GIT_REPOSITORY https://github.com/nothings/stb.git)
# 从github上下载stb这个包,下载到zxing-cpp.release/_deps这个文件夹里面
FetchContent_MakeAvailable (stb)
add_library(stb::stb INTERFACE IMPORTED) # 定义stb::stb
target_include_directories(stb::stb INTERFACE ${stb_SOURCE_DIR}) # 头文件链接目录路径
else()
add_library(stb::stb ALIAS PkgConfig::STB)
endif()
endmacro()
它已经从github上下载了stb这个包,下载到zxing-cpp.release/_deps这个文件夹里面。但还是链接不上,原因不明,有知道的大哥可以在评论区说一下。既然它通过这种cmake自动化下载并添加的方式无法解决stb依赖,那我们就手动添加依赖。
- 先从github上下载stb这个包
cd {你用来保存stb包的文件夹}
git clone https://github.com/nothings/stb.git
- 修改
zxing-cpp/zxing.cmake
文件的内容
将它关于stb的操作都注释掉,自己去设置stb包的路径。因为stb只有.h
文件,它的头文件里面已经包含了它的实现,因此只需要添加include_directories
和target_include_directories
macro(zxing_add_package_stb)
unset (STB_FOUND CACHE)
include_directories("{你用来保存stb包的文件夹}/stb")
add_library(stb::stb INTERFACE IMPORTED)
target_include_directories(stb::stb INTERFACE "{你用来保存stb包的文件夹}/stb")
if (BUILD_DEPENDENCIES STREQUAL "AUTO")
find_package(PkgConfig)
# pkg_check_modules (STB IMPORTED_TARGET stb)
elseif (BUILD_DEPENDENCIES STREQUAL "LOCAL")
find_package(PkgConfig REQUIRED)
# pkg_check_modules (STB REQUIRED IMPORTED_TARGET stb)
endif()
# if (NOT STB_FOUND)
# include(FetchContent)
# FetchContent_Declare (stb
# GIT_REPOSITORY https://github.com/nothings/stb.git)
# FetchContent_MakeAvailable (stb)
# add_library(stb::stb INTERFACE IMPORTED)
# target_include_directories(stb::stb INTERFACE ${stb_SOURCE_DIR})
# else()
# add_library(stb::stb ALIAS PkgConfig::STB)
# endif()
endmacro()
完成以上操作后就能编译zxing-cpp
成功了