在CMake中使用第三方共享对象库和头文件



我正试图使用这个ZED Open Capture库来为我在RaspberryPi上的项目使用ZED Mini相机。我成功地安装了库,共享对象文件位于/usr/local/lib/libzed_open_capture.so,include头位于/usr/local/include/zed-open-capture/。为了包含这个库,我将以下行添加到我的CMakeLists.txt 中

find_library(ZED_LIB zed_open_capture) 
include_directories("/usr/local/include/zed-open-capture/")
add_executable(zed_pub src/zed_pub.cpp)
target_link_libraries(zed_pub ${ZED_LIB})

现在,当我使用这个代码时,它显示了这个错误"‘sl_oc::video’ has not been declared";

#include "videocapture.hpp" //Library Header File
sl_oc::video::VideoCapture cap;
cap.initializeVideo();
const sl_oc::video::Frame frame = cap.getLastFrame();
  • 有人能解释一下CMake中应该如何使用共享对象库文件和头文件吗?该库已经使用CMake构建和sudo make install安装在我的Linux系统上

库的github repo位于https://github.com/stereolabs/zed-open-capture

此外,我找不到find_PKG_name.cmake,因此无法使用find_package((选项。

videocapture.hpp将您需要的定义封装在#ifdef VIDEO_MOD_AVAILABLE中。这似乎没有定义。ZED包中的根CMakeLists.txt默认BUILD_VIDEO为ON,因此这可能都是为包构建定义的。但正如其他人所指出的,该软件包不会在安装的任何地方保留这些信息。";右";包执行此操作的方式将是在安装时配置/修改包含文件以考虑构建配置;config.hpp";具有适当定义的文件。或者在安装中包含一个zed-config.cmake文件,以及所有必要的导入和定义。

你的短路解决方案应该是好的。只需添加target_compile_definitions(zed_pub PUBLIC VIDEO_MOD_AVAILABLE)即可。如果您想在将来更干净地执行此操作,请为zed_lib创建一个IMPORTED目标,并在该目标上设置include_directoriescompile_definitions,以便库的所有用户都能自动定义该目标。

根据ZED Open Capture的CMakeLists.txt:

...
# Install rules
set_target_properties(${PROJECT_NAME} PROPERTIES
PUBLIC_HEADER "${HDR_FULL}"
)
install(TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/include/zed-open-capture)

参考:https://github.com/stereolabs/zed-open-capture/blob/dfa0aee51ccd2297782230a05ca59e697df496b2/CMakeLists.txt#L142-L148

ZED Open Capture似乎没有提供任何";CMake-config";文件

因此,您必须创建自己的FindZED.cmake模块和/或改进该项目的CMakeLists.txt。。。

相关内容

最新更新