CMake已构建库依赖问题:raspicam链接mmal失败
解决CMake配置raspicam依赖mmal的链接问题
1. 修正raspicam库的CMake配置(/myproj/raspicam/src/CMakeLists.txt)
你之前的配置存在两个核心问题:一是链接库时错误地将变量名当作字符串使用,二是未给raspicam库添加运行时路径(rpath),导致生成的libraspicam.so无法指引后续程序找到mmal依赖。修改如下:
# 定位mmal_core库 FIND_LIBRARY(mmalcore_LIBS NAMES mmal_core PATHS ../../userland/build/lib) # 强制检查库是否找到,避免静默失败 if(NOT mmalcore_LIBS) message(FATAL_ERROR "mmal_core library not found!") endif() # 链接库时使用变量而非字符串,确保正确关联库路径 target_link_libraries(raspicam ${mmalcore_LIBS}) # 给raspicam库设置运行时路径,适配Yocto交叉编译的相对路径结构 set_target_properties(raspicam PROPERTIES # 编译阶段链接器使用的路径 BUILD_RPATH "../../userland/build/lib" # 运行时动态链接器使用的路径,$ORIGIN代表当前库所在目录 INSTALL_RPATH "$ORIGIN/../../userland/build/lib" # 自动将链接时的路径加入INSTALL_RPATH INSTALL_RPATH_USE_LINK_PATH TRUE )
2. 测试程序的CMake配置(/myproj/CMakeLists.txt)
测试程序只需找到并链接raspicam库即可,无需重复处理mmal依赖:
cmake_minimum_required(VERSION 3.10) project(simpletest_raspicam) # 定位编译好的raspicam库 FIND_LIBRARY(raspicam_LIBS NAMES raspicam PATHS raspicam/build/src) if(NOT raspicam_LIBS) message(FATAL_ERROR "raspicam library not found!") endif() # 生成测试可执行文件 add_executable(simpletest_raspicam simpletest_raspicam.cpp) # 链接raspicam库 target_link_libraries(simpletest_raspicam ${raspicam_LIBS})
3. 额外注意事项
- 确认
../../userland/build/lib目录下确实存在libmmal_core.so等依赖库 - Yocto交叉编译时,需确保交叉工具链的
CMAKE_SYSROOT等变量配置正确,保证CMake能找到目标架构的库 - 如果后续将raspicam库安装到系统目录,需根据实际安装路径调整
INSTALL_RPATH的相对结构
内容的提问来源于stack exchange,提问作者BeautifulYautja
相关产品推荐
相关产品推荐

