【问题标题】:CMake include_directories skips OS X frameworksCMake include_directories 跳过 OS X 框架
【发布时间】:2016-01-24 17:48:35
【问题描述】:

我在 OS X Yosemite 上使用 CMake 3.3.2。如果我将框架路径放入include_directories,则生成的 Makefile 不包含该目录。一个简短的例子:

cmake_minimum_required(VERSION 3.0)
project(testproj)
include_directories(/System/Library/Frameworks/OpenGL.framework)
add_library(testlib test.c)

make 输出:

Scanning dependencies of target testlib
/Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/testlib.dir/build.make CMakeFiles/testlib.dir/build
[ 50%] Building C object CMakeFiles/testlib.dir/test.c.o
/Library/Developer/CommandLineTools/usr/bin/cc    -o CMakeFiles/testlib.dir/test.c.o   -c /Users/wrar/test/test.c

我预计include_directories 命令会对编译器行产生影响,并且由于官方OPENGL_INCLUDE_DIR 具有我在示例中传递的值,我希望它是一个正确的值。我错过了什么?

【问题讨论】:

  • include_directories 应该在 add_library 之前在库中生效。
  • @Tsyvarev 没有任何区别,我已经更新了示例
  • target_include_directories 适合你吗?
  • 过滤掉 OSX 框架路径是 CMake 实现的一部分:参见ENH: make sure default /System framework is not added with -F commit。我认为其背后的原因是您的 CMake 项目不应依赖于您使用的 OSX 版本/安装。
  • @Florian 好吧,这就是 FindOpenGL 给我的

标签: macos cmake


【解决方案1】:

把我的 cmets 变成答案

标准框架包含路径由 CMake 过滤

CMake 对 OS X 框架有很多特殊处理。其中之一是删除显式命名的框架包含和库搜索路径(参见commit)。

我同意这令人困惑

find_package(OpenGL REQUIRED)
message(STATUS "OPENGL_INCLUDE_DIR: ${OPENGL_INCLUDE_DIR}")
include_directories(${OPENGL_INCLUDE_DIR})
add_library(...)

确实返回OPENGL_INCLUDE_DIR: /System/Library/Frameworks/OpenGL.framework,但您在cc 命令行中找不到此路径。

但是这个搜索路径是隐式的,这意味着编译器最清楚在哪里可以找到框架的头文件。因此,在 CMake 中对 OS X 框架包含/库目录的过滤确实反映了在使用框架时编译器/链接器的特殊处理。

编译器如何找到框架的包含文件?

通过作为包含目录名称给出的框架名称。见MAC Developer Library/Framework Programming Guide/Including Frameworks:

您可以使用#include 指令在代码中包含框架头文件。 [...]

  #include <Framework_name/Header_filename.h>

更多详情请见cmake not finding gl.h on OS X

我刚刚测试了您的示例并添加了例如#include &lt;OpenGL/glext.h&gt;test.c 并且找到了框架中的header。

如果您不希望首先找到 OpenGL 标准框架(默认),请参阅 find_path documentation 并查找 CMAKE_FIND_FRAMEWORK

或者,如果您在 /some/other/path 中有自己的 OpenGL 发行版 - 并且您省略了 find_package(OpenGL) 的使用 - 您可以提供 include_directories(SYSTEM /some/other/path)

【讨论】:

  • 通过-isystem传递本地目录并不能帮助编译器首先使用本地头(代码包括&lt;OpenGL/glu.h&gt;"glext.h"之前),我需要更改代码吗?
  • @wRAR 您可以在add_library() 调用之前添加add_compile_options("$&lt;$&lt;PLATFORM_ID:Darwin&gt;:-include/some/other/path/glext.h&gt;")。这将使enforce the include 成为您在 OS X 上的项目中编译的所有文件中的第一个。或者您将其与target_compile_options() 一起使用更具体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2010-11-20
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多