CMake - get_filename_component未知的组件目录

时间:2015-08-09 02:02:47

标签: c++ cmake glfw

我在使用CMake时遇到了一些麻烦。 我正在尝试与GLFW链接并包含我自己项目的多个源文件。 (我正在从Visual Studio切换到我的项目跨平台)。

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}))

3 个答案:

答案 0 :(得分:3)

似乎至少有一个带有错误值的迭代_headerFile和path。在使用以下代码在foreach循环中启动get_filename_component之前,尝试打印这些变量的值。

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

有时,这些类型的错误可能由这些参数的错误值生成。

答案 1 :(得分:1)

通常会在"多个内容中看到此错误" *Config.cmake个文件(例如,您为lib_A运行CMake,{CM}同时使用lib_Blib_Clib_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)

答案 2 :(得分:0)

对我来说,此错误是由于将列表放入get_filename_component()中引起的。

示例:

set(abc /path/first /path/second)
get_filename_component(abc_name ${abc} NAME)

错误看起来像:

  

get_filename_component未知组件/ path / second