2015-08-09 27 views
1

我遇到了CMake的一些麻煩。 我想鏈接GLFW幷包含我自己的項目的多個源文件。 (我從Visual Studio切換到使我的項目跨平臺)。CMake - get_filename_component未知組件目錄

GLFW是在文件夾DEPS/GLFW-3.1.1和我的源代碼是在文件夾SRC

這裏是我的CMakeLists.txt文件:

# Tell CMake to use a minimum of version 3.2 
cmake_minimum_required(3.2) 

project(Sparky) 
# TODO: Versions 

# Add all of our source code to the project 
file(GLOB_RECURSE Sparky_SOURCES "src/*.cpp") 
file(GLOB_RECURSE Sparky_HEADERS "src/*.h") 

set(Sparky_INCLUDE_DIRS "") 
foreach (_headerFile ${Sparky_HEADERS}) 
    get_filename_component(_dir ${_headerFile} path) 
    list (APPEND Sparky_INCLUDE_DIRS ${_dir}) 
endforeach() 
list(REMOVE_DUPLICATES Sparky_INCLUDE_DIRS) 

add_subdirectory(deps/glfw-3.1.1) 
include_directories(${Sparky_INCLUDE_DIRS}) 
include_directories(deps/glfw-3.1.1/include) 

add_executable(Sparky ${Sparky_SOURCES} 
target_link_libraries(Sparky glfw ${GLFW_LIBRARIES})) 

回答

2

似乎對於變量_headerFile和路徑,至少存在一次錯誤值的迭代。嘗試打印這些變量的值,然後使用以下代碼在foreach循環中啓動get_filename_component。

message(STATUS "_headerFile: ${_headerFile}) 
message(STATUS "path: " ${path} ) 

有時這些類型的錯誤可能由這些參數的錯誤值產生。

1

這是經常可以看到這樣的錯誤與*Config.cmake文件「多次包含」(例如運行CMake的爲lib_A它使用兩個lib_Blib_C同時lib_B還鏈接到lib_C)。

你可以通過CMake的信息檢測到這種行爲:

message(STATUS "_headerFile: ${_headerFile}) 
message(STATUS "path: " ${path} ) 

然後輸出將被顯示兩次或更多,可能與每次進入*Config.cmake文件時,不同的值。

可以使用輕鬆解決問題IF語句(覺得在C頭文件中的#ifndef的):

IF (MYPKG_FOUND) 
    # Already in cache, be silent 
    SET(MYPKG_FIND_QUIETLY TRUE) 
ELSE (EdgeFlow_FOUND) 
    # do your stuff, you're here for the first time! 
ENDIF(MYPKG_FOUND)