CMake - get_filename_component 未知组件目录
CMake - get_filename_component Unknown component directory
我在使用 CMake 时遇到了一些麻烦。 我正在尝试 link 使用 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}))
似乎至少有一次迭代的变量 _headerFile 和路径的值错误。使用以下代码在 foreach 循环中启动 get_filename_component 之前尝试打印这些变量的值。
message(STATUS "_headerFile: ${_headerFile} )
message(STATUS "path: " ${path} )
有时这些类型的错误可能是由这些参数的错误值引起的。
在 *Config.cmake
个文件的 "multiple inclusions" 中看到此错误很常见(例如,您 运行 CMake for lib_A
同时使用 lib_B
和 lib_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)
对我来说,这个错误是由于将 list 放入 get_filename_component()
.
引起的
示例:
set(abc /path/first /path/second)
get_filename_component(abc_name ${abc} NAME)
错误看起来像:
get_filename_component unknown component /path/second
我在使用 CMake 时遇到了一些麻烦。 我正在尝试 link 使用 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}))
似乎至少有一次迭代的变量 _headerFile 和路径的值错误。使用以下代码在 foreach 循环中启动 get_filename_component 之前尝试打印这些变量的值。
message(STATUS "_headerFile: ${_headerFile} )
message(STATUS "path: " ${path} )
有时这些类型的错误可能是由这些参数的错误值引起的。
在 *Config.cmake
个文件的 "multiple inclusions" 中看到此错误很常见(例如,您 运行 CMake for lib_A
同时使用 lib_B
和 lib_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)
对我来说,这个错误是由于将 list 放入 get_filename_component()
.
示例:
set(abc /path/first /path/second)
get_filename_component(abc_name ${abc} NAME)
错误看起来像:
get_filename_component unknown component /path/second