CMake include_directories 跳过 OS X 框架

wRA*_*RAR 3 macos cmake

我在 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)
Run Code Online (Sandbox Code Playgroud)

制作输出:

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
Run Code Online (Sandbox Code Playgroud)

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

Flo*_*ian 5

把我的评论变成答案

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

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

我同意这令人困惑

find_package(OpenGL REQUIRED)
message(STATUS "OPENGL_INCLUDE_DIR: ${OPENGL_INCLUDE_DIR}")
include_directories(${OPENGL_INCLUDE_DIR})
add_library(...)
Run Code Online (Sandbox Code Playgroud)

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

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

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

通过框架的名称作为包含的目录名称给出。请参阅MAC 开发人员库/框架编程指南/包括框架

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

  #include <Framework_name/Header_filename.h>
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅cmake 在 OS X 上找不到 gl.h。

我刚刚测试了您的示例并添加了例如#include <OpenGL/glext.h>test.c并且找到了框架中的标题。

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

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