我在上使用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)制造输出:
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有我在示例中传递的值,所以我希望它是一个正确的值。我遗漏了什么?
发布于 2015-10-27 09:35:41
把我的评论变成一个答案
标准框架包括路径由CMake过滤
CMake对OS框架有很多特殊处理。其中之一是删除显式命名的框架包含和库搜索路径(请参阅此提交)。
我同意这让人困惑
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框架包含/库目录的过滤确实反映了在使用框架时编译器/链接器的特殊处理。
编译器如何找到框架的包含文件?
由框架的名称指定为包含的目录名。请参阅MAC开发人员库/框架编程指南/包括框架
使用#include指令在代码中包含框架头文件。..。 #包括
有关更多详细信息,请参阅cmake在OS X上找不到gl.h。
我刚刚测试了您的示例,并将#include <OpenGL/glext.h>添加到test.c中,并找到了框架中的标头。
如果不希望首先找到OpenGL标准框架(默认情况),请参阅文档并查找CMAKE_FIND_FRAMEWORK。
或者,如果您在OpenGL中有自己的/some/other/path发行版--并且省略了find_package(OpenGL)的使用--您可以给出include_directories(SYSTEM /some/other/path)。
https://stackoverflow.com/questions/33332021
复制相似问题