2015-10-25 58 views
2

我在OS X Yosemite上使用CMake 3.3.2。如果我將框架路徑放入include_directories,生成的Makefile將不包含該目錄。一個簡單的例子:CMake include_directories跳過OS X框架

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有我的例子中傳遞的值,我期望它是一個正確的價值。我錯過了什麼?

+0

'include_directories'應該在** add_library之前在庫上生效。 – Tsyvarev

+0

@Tsyvarev沒有任何區別,我更新了示例 – wRAR

+0

「target_include_directories」是否適合您? – usr1234567

回答

4

談到我的意見爲答案

標準框架包括路徑由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命令行這條路。

但是這個搜索路徑是隱含的,這意味着編譯器知道在哪裏可以找到框架的頭文件。因此,對OS X框架的這種過濾包括CMake中的/庫目錄,它反映了在使用框架時對編譯器/鏈接器的特殊處理。

編譯器如何找到框架的包含文件?

由框架的名稱作爲include的目錄名給出。請參閱MAC Developer Library/Framework Programming Guide/Including Frameworks

使用#include僞指令在代碼中包含框架頭文件。 [...]

#include <Framework_name/Header_filename.h> 

詳情請參閱cmake not finding gl.h on OS X

我剛剛測試了您的示例並添加了例如#include <OpenGL/glext.h>test.c,並找到框架中的標題。

如果您不希望先找到OpenGL標準框架(默認設置),請參閱find_path documentation並查找CMAKE_FIND_FRAMEWORK

或者,如果您在/some/other/path中擁有自己的OpenGL發行版 - 並且您省略了使用find_package(OpenGL) - 則可以給include_directories(SYSTEM /some/other/path)

+0

通過'-isystem'傳遞本地目錄不會幫助編譯器首先使用本地頭文件(代碼在''glext.h''之前包含''),是否需要更改代碼? – wRAR

+0

@wRAR在add_library()調用之前,您可以添加'add_compile_options(「$ <$ : - include/some/other/path/glext.h>」)''。這將[執行include](http://stackoverflow.com/questions/3387453/include-header-files-using-command-line-option)首先在您在OS X上的項目中編譯的所有文件中。或者你可以使用['target_compile_options()'](https://cmake.org/cmake/help/v3.4/command/target_compile_options.html)來更具體。 – Florian