【问题标题】:Using CMake, why do some third party libraries automatically give you visibility into their include directory while others don't?使用 CMake,为什么某些第三方库会自动让您查看其包含目录,而其他库却没有?
【发布时间】:2017-01-31 16:06:46
【问题描述】:

在 CMake 中,大多数第三方库根本不需要我指定它们的包含目录......他们似乎在幕后为我处理了这些。但是,一些第三方库似乎将这项工作放在了我的盘子上。

我在第三方库中发现的差异是否表明我做错了什么?还是 CMake 只是一个结构较少的环境,一些第三方库会比其他库更多地握住你的手?这里发生了什么?最佳做法?

我将举几个例子。 OpenCV 让事情变得超级简单,我无需提及它们的包含目录:

set(OpenCV_DIR ${THIRD_PARTY_DIR}/OpenCV)
find_package(OpenCV REQUIRED)
...
add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

但是,Google 的协议缓冲区要求我使用 include_directories 命令才能使用它们的头文件:

set(CMAKE_PREFIX_PATH ${THIRD_PARTY_PROTOBUF_DIR})
find_package(Protobuf ${THIRD_PARTY_DIR}/protobuf-2.6.1)
...
include_directories(${PROTOBUF_INCLUDE_DIRS})
add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})

【问题讨论】:

  • 可能,在第一种情况下,您在系统中安装了 OpenCV 作为系统范围的包,因此可以在标准路径中找到标头。尝试卸载它一段时间并再次测试它。让我知道,如果是这样,我会将评论转为答案。 ;-)
  • 感谢@skypjack 的回复,但我使用的 OpenCV 和其他第三方库并未安装在系统范围内。我从源代码(或下载的预构建二进制文件)构建了第三方,并将它们的二进制文件/头文件放在我基线的第三方文件夹中。无需安装。

标签: c++ cmake include-path


【解决方案1】:

target_include_directories() 命令是在 2013 年 5 月与 CMake version 2.8.11 一起引入的。这为库开发人员提供了自我传播包含路径的可能性。

但将所有内容更改为 target_include_directories() 确实会破坏与 CMake 先前版本的向后兼容性(请参阅 target_include_directories prior to 2.8.12?)。

所以这主要是一个遗留问题,我认为随着时间的推移会消失。

大多数时候,您可以通过库根目录 CMakeLists.txt 顶部的 cmake_minimum_required() 行查看库正在使用的内容。在例如的情况下Protocol Buffers library,他们确实已将CMakeLists.txt 更新为cmake_minimum_required(VERSION 2.8.12),现在使用target_include_directories()(参见2015 年7 月的commit)。

【讨论】:

  • 要更详细地讨论target_include_directories() 及其其他相关的target_... 命令,this article 可能有用(披露:我写的)。这篇文章更多地关注target_link_libraries(),但它展示了诸如包含目录之类的东西可以附加到目标的机制,以便被链接到它的东西自动拾取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多