在 cmake c++ 项目中包含库的首选方法是啥?

Posted

技术标签:

【中文标题】在 cmake c++ 项目中包含库的首选方法是啥?【英文标题】: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 ($ENVHOME/freenect2/include)

# Find freenect package
set(freenect2_DIR $ENVHOME/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) 【参考方案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 $ENVHOME/freenect2/lib/cmake/freenect2)

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

# Include directories to get freenect headers
include_directories($ENVHOME/freenect2/include)

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

【讨论】:

以上是关于在 cmake c++ 项目中包含库的首选方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue 项目中包含或初始化 jQuery 库的最佳方法是啥?

如何在Android主项目中包含库项目中使用的aar文件

在现代CMake项目中存档静态依赖项

在cmake的所有cpp文件中包含c ++标头[重复]

在 npm 上发布 wasm 库的首选方式是啥?

使用 cmake 编译带有 v8 库的 C++ 程序