cmake 如何知道包含文件和库在哪里?

Posted

技术标签:

【中文标题】cmake 如何知道包含文件和库在哪里?【英文标题】:How can cmake know where the include files and libs are? 【发布时间】:2016-06-30 11:44:39 【问题描述】:

我正在使用 cmake 成功编译一个用 C++ 和 OpenCV 编写的简单 DisplayImage 项目。我遵循了这些说明:http://docs.opencv.org/3.0-beta/doc/tutorials/introduction/linux_gcc_cmake/linux_gcc_cmake.html。我真的不明白 cmake 是如何从 CMakeLists.txt 文件中检索 OpenCV 包含和库的:

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( $OpenCV_INCLUDE_DIRS )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage $OpenCV_LIBS )

我的意思是我不应该告诉它在哪里搜索 OpenCV?例如 /usr/local/lib 或 /usr/local/include/opencv ... 它如何通过只告诉它我想使用 OpenCV 而没有指定在哪里寻找它来使用 OpenCV?我想我错过了一些东西..请帮忙!

【问题讨论】:

我不是 CMake 专家,但我猜 find_package 是关键。不确定这是否有帮助:cmake.org/cmake/help/v3.0/command/find_package.html cmake.org/Wiki/… 【参考方案1】:

find_package 将运行一个 cmake 模块(即脚本),它看起来例如在 OpenCV 的预定义目录中。该模块将设置 cmake 变量,如 OpenCV_INCLUDE_DIRS 和 OpenCV_LIBS。正如您所做的正确,您仍然必须将这些目录和库添加到项目中的适当列表中,因为这取决于您的项目正在做什么:您可能在同一个 make 文件中构建多个可执行文件和/或库,但可能不想将所有库链接到所有可执行文件/库。

如果您对该模块的工作原理感兴趣,可以查看一下。通常您会在 /usr/share/cmake-2.8/Modules 中找到它(将“2.8”替换为您正在使用的 cmake 版本)。我的机器上没有 FindOpenCV.cmake 文件,所以我猜它是随 OpenCV 一起提供的。其他 Find 脚本随 cmake 本身一起提供,因此您将拥有很多文件。 (该目录还有其他模块,不只是 find_package 脚本。)

【讨论】:

以上是关于cmake 如何知道包含文件和库在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

包和库管理和安装,以及与cmake的接口

如何知道 CMake 找到的库版本?

linux cmake 选项

如何构建具有 cmake 文件的 c++/c 项目?

Perl 程序如何知道在哪里可以找到包含它使用的 Perl 模块的文件?

CMake不知道Qt4 qmake在哪里