我有一个由CMake使用SFML库生成的VS2010项目。该项目设置如下,将 lib / SFML-2.0-rc / include 添加到include目录中:
/lib
+ /SFML-2.0-rc
+ /include
+ /SFML
+ Graphics.hpp
+ /lib
/project
+ /src
+ /engine
+ /assets
+ CMakeLists.txt
+ asset.hpp
+ CMakeLists.txt
+ engine.hpp
+ engine.cpp
+ CMakeLists.txt
+ main.cpp
+ CMakeLists.txt
我正在尝试使用 assets.hpp 中的#include <SFML/Graphics.hpp>
,但我收到以下错误:
fatal error C1083: Cannot open include file: 'SFML/Graphics.hpp': No such file or directory
尝试从 engine.hpp 中添加时,我也遇到了这个错误。但是,在 engine.cpp 中,我已经在使用该包含行了,我可以成功构建并运行该项目。
Visual Studio能够自动完成SFML包含路径,并且在配置属性&gt;中。 C / C ++&gt;其他包含目录我可以看到所有库都已配置。
所以我的问题是:什么可能导致此错误只发生在包含头文件时?
这些是生成VS2010解决方案的CMake构建文件。
cmake_minimum_required (VERSION 2.8)
project (project)
set (project_SOURCE
""
)
include_directories("src")
add_subdirectory (src)
add_executable (project ${project_SOURCE})
target_link_libraries (project Engine)
set (project_SOURCE
${project_SOURCE}
"${CMAKE_CURRENT_SOURCE_DIR}/main.cpp"
PARENT_SCOPE
)
include_directories ("engine")
add_subdirectory (engine)
set (HEADERS
"${CMAKE_CURRENT_SOURCE_DIR}/engine.hpp"
)
set (SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/engine.cpp"
)
include_directories("assets")
add_subdirectory(assets)
add_library(Engine
${SOURCE} ${HEADERS}
)
set (LIBS_ROOT "" CACHE PATH "Root directory of external libs")
set (LIBS_SFML_FOLDER "SFML-2.0-rc" CACHE STRING "Name of the SFML external folder")
set (SFMLDIR "${LIBS_ROOT}/${LIBS_SFML_FOLDER}")
## SFML
if (NOT SFMLDIR)
message (FATAL_ERROR "SFML directory hasn't been specified")
endif()
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${SFMLDIR}/cmake/Modules")
set (SFML_STATIC_LIBRARIES TRUE)
set (SFML_COMPONENTS system window graphics network audio main)
find_package (SFML 2 COMPONENTS ${SFML_COMPONENTS} REQUIRED)
if (SFML_FOUND)
include_directories(${SFML_INCLUDE_DIR})
target_link_libraries (Engine ${SFML_LIBRARIES})
endif ()
set (HEADERS
${HEADERS}
"${CMAKE_CURRENT_SOURCE_DIR}/asset.hpp"
PARENT_SCOPE
)
答案 0 :(得分:0)
指示的目录结构表明您需要编写
#include <SFML/include/Graphics.hpp>
这可以解释错误。
答案 1 :(得分:0)
通过一系列包含,应用程序项目中的 main.cpp 间接包括“engine / assets / asset.hpp *至 engine / engine.hpp 。因此,在应用程序项目构建期间, asset.hpp 试图包含一个SFML库,但无法找到它。
engine.cpp (以及其他实现文件)能够包含SMFL标头的原因是它们的依赖关系在库项目构建期间被链接,其中已经配置了依赖项。实现所需的所有内容都包含在生成的 Engine.lib 文件中。
简单地说,问题在于解决方案分为两个项目:引擎库和应用程序可执行文件。前者配置为访问SFML库,但后者不是。
解决方案是将外部库包含到应用程序项目配置中,或者更加小心地在头文件中公开库依赖项。
不幸的是,我没有发布必要的细节来查明原问题中的问题,所以我添加了CMakeLists.txt文件的内容,这有助于揭示问题。