在 CMake 中使用第三方共享 Object 库和 header 文件
Using 3rd Party Shared Object Library and header files in CMake
我正在尝试使用这个 ZED Open Capture 库来为我在 RaspberryPi 上的项目使用 ZED Mini 相机。我成功安装了库,共享 object 文件位于 /usr/local/lib/libzed_open_capture.so
,包含 header 位于 /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 中使用共享 Object 库文件和 header 文件吗?该库已经使用 CMake build 和
sudo make install
安装在我的 Linux 系统上。
库的 github 存储库位于 https://github.com/stereolabs/zed-open-capture
我也找不到 Find_PKG_name.cmake 所以我不能使用 find_package() 选项。
根据 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)
ZED Open Capture 似乎不提供任何“CMake 配置”文件...
所以你必须创建自己的 FindZED.cmake
模块 and/or 改进这个项目的 CMakeLists.txt...
videocapture.hpp
将您需要的定义包装在 #ifdef VIDEO_MOD_AVAILABLE
中。这似乎没有定义。 ZED 包中的根 CMakeLists.txt 默认 BUILD_VIDEO 为 ON,因此这很可能都是为包构建定义的。但正如其他人指出的那样,该软件包不会在安装的任何地方保留此信息。包执行此操作的“正确”方法是在安装时 configure/modify 包含文件以说明构建配置,可能是通过生成具有适当定义的“config.hpp”文件。或者在安装中包含一个 zed-config.cmake
文件,其中包含所有必要的导入和定义。
你的短路解决方案应该没问题。只需添加 target_compile_definitions(zed_pub PUBLIC VIDEO_MOD_AVAILABLE)
。如果你想为将来做得更干净,为 zed_lib 创建一个 IMPORTED 目标,并在该目标上设置 include_directories
和 compile_definitions
,这样库的所有用户都可以这是自动定义的。
我正在尝试使用这个 ZED Open Capture 库来为我在 RaspberryPi 上的项目使用 ZED Mini 相机。我成功安装了库,共享 object 文件位于 /usr/local/lib/libzed_open_capture.so
,包含 header 位于 /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 中使用共享 Object 库文件和 header 文件吗?该库已经使用 CMake build 和
sudo make install
安装在我的 Linux 系统上。
库的 github 存储库位于 https://github.com/stereolabs/zed-open-capture
我也找不到 Find_PKG_name.cmake 所以我不能使用 find_package() 选项。
根据 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)
ZED Open Capture 似乎不提供任何“CMake 配置”文件...
所以你必须创建自己的 FindZED.cmake
模块 and/or 改进这个项目的 CMakeLists.txt...
videocapture.hpp
将您需要的定义包装在 #ifdef VIDEO_MOD_AVAILABLE
中。这似乎没有定义。 ZED 包中的根 CMakeLists.txt 默认 BUILD_VIDEO 为 ON,因此这很可能都是为包构建定义的。但正如其他人指出的那样,该软件包不会在安装的任何地方保留此信息。包执行此操作的“正确”方法是在安装时 configure/modify 包含文件以说明构建配置,可能是通过生成具有适当定义的“config.hpp”文件。或者在安装中包含一个 zed-config.cmake
文件,其中包含所有必要的导入和定义。
你的短路解决方案应该没问题。只需添加 target_compile_definitions(zed_pub PUBLIC VIDEO_MOD_AVAILABLE)
。如果你想为将来做得更干净,为 zed_lib 创建一个 IMPORTED 目标,并在该目标上设置 include_directories
和 compile_definitions
,这样库的所有用户都可以这是自动定义的。