在 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++ 项目中包含库的首选方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章