【问题标题】:What's the preferred way to include a library in a cmake c++ project?在 cmake c++ 项目中包含库的首选方法是什么?
【发布时间】:2016-06-10 07:55:21
【问题描述】:

我已经构建了 libfreenect2 库,现在我想将它包含在我的 c++ 项目中。之前,我在 cmake 中包含了一些库,如下所示:

# Include OpenCV
find_package( OpenCV REQUIRED )
target_link_libraries( ${PROJECT_NAME} ${OpenCV_LIBS} )

这意味着该库必须正确“安装”到我的系统中,cmake 才能找到它,对吗?

但是,这一次我需要“手动”将必要的文件和目录包含到我的项目中。但我不知道如何“正确”地做到这一点。

一直在关注this tutorial,但令人困惑的是我必须如何添加库、包含目录、添加子目录(为什么突然“添加”而不是“包含”)、链接库......术语是否不一致,或者这种方法真的总是这么乱吗?我不明白为什么仅仅表达库目录 ONCE 是不够的,然后 cmake 应该弄清楚如何处理它?对不起我的无知。

无论如何,包含自定义构建库的首选步骤是什么?

这是我目前的尝试,(当我尝试编译我的项目时)产生“找不到 -lfreenect2”

project(kinect-test)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)

add_executable(${PROJECT_NAME} ${SRC_LIST})

# Include directories
include_directories ($ENV{HOME}/freenect2/include)

# Find freenect package
set(freenect2_DIR $ENV{HOME}/freenect2/lib/cmake/freenect2)
find_package(freenect2 REQUIRED)
target_link_libraries (${PROJECT_NAME} freenect2)

【问题讨论】:

  • 我无法告诉您通常首选的方式,但我所做的是拥有一个 cmake 脚本库,可以在构建树中下载并构建所需的库。如果您愿意提供帮助,我已经启动了一个开源项目! github.com/madmongo1/sanity
  • 谢谢,但是添加一个 cmake 脚本库来查找我的库让我感到困惑。我很乐意为您的项目提供帮助,但我想在这个阶段我可能弊大于利。也许以后,当我了解如何实际使用 cmake 时......
  • 命令find_package(freenect2 REQUIRED) 设置变量,描述库。变量freenect2_LIBRARIES 包含要链接的库,变量freenect2_INCLUDE_DIRS 包含其听众所在的目录。您需要在脚本中使用这些变量:include_directories(${freenect2_INCLUDE_DIRS})target_link_libraries(${PROJECT_NAME} ${freenect2_LIBRARIES})。顺便说一句,你对 OpenCV 做的完全一样。
  • 按照你的建议做了(见帖子的编辑3)。仍然,同样的错误。
  • 可能复制到Building with libfreenect2。对于像freenect2 这样的启用 CMake 的项目,您所做的是正确的。只需将find_package() 命令移到顶部(在project() 命令后面)。 freenect2_ 变量仅在 find_package() 命令之后定义。并做target_link_libraries(${PROJECT_NAME} ${freenect2_LIBRARIES})

标签: c++ cmake


【解决方案1】:

您需要指定可以找到给定库的搜索路径。我假设文件libfreenect.so(或libfreenect.a)位于/path/to/freenect - 请酌情编辑,可能使用变量。在您的 target_link_libraries 命令上方添加命令:

link_directories(/path/to/freenect)

【讨论】:

  • 感谢您的回复。我已经完成了您的建议(请参阅我的问题编辑)。我仍然遇到同样的错误:cannot find -lfreenect2
  • 您能否将cmake 设置为详细模式并共享最终的编译器链接行(可能类似于g++ ... -o kinect-test ... 的行?
  • 这个? /usr/bin/c++ CMakeFiles/kinect-test.dir/main.cpp.o -o kinect-test -rdynamic -lfreenect2
【解决方案2】:

这就是我最终做的:

  • 设置cmake前缀使其能够找到配置文件(名为“freenect2Config.cmake”)
  • “查找”“包”,使 cmake 运行“查找脚本”
  • 包含目录以获取标题
  • 链接库文件

CMakeLists.txt

project(kinect-test)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)

add_executable(${PROJECT_NAME} ${SRC_LIST})

# Set cmake prefix path to enable cmake to find freenect2
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{HOME}/freenect2/lib/cmake/freenect2)

# Find freenect, to set necessary variables
find_package(freenect2 REQUIRED)

# Include directories to get freenect headers
include_directories($ENV{HOME}/freenect2/include)

# Link freenect libraries with the project
target_link_libraries(${PROJECT_NAME} ${freenect2_LIBRARIES})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 2014-05-28
    • 2020-07-17
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多