2

SFML ライブラリを使用して、CMake によって生成されている VS2010 プロジェクトがあります。プロジェクトは次のようにセットアップされ、lib/SFML-2.0-rc/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 インクルード パスをオートコンプリートでき、[構成プロパティ] > [C/C++] > [追加のインクルード ディレクトリ]で、すべてのライブラリが構成されていることを確認できます。

私の質問は次のとおりです。ヘッダーファイルからインクルードする場合にのみ、このエラーが発生する原因は何ですか?

CMakeLists ファイル

これらは、VS2010 ソリューションを生成した CMake ビルド ファイルです。

プロジェクト/CMakeLists.txt

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)

project/src/CMakeLists.txt

set (project_SOURCE
    ${project_SOURCE}
    "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp"
    PARENT_SCOPE
)
include_directories ("engine")
add_subdirectory (engine)

project/src/engine/CMakeLists.txt

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

project/src/engine/assets/CMakeLists.txt

set (HEADERS
    ${HEADERS}
    "${CMAKE_CURRENT_SOURCE_DIR}/asset.hpp"
    PARENT_SCOPE
)
4

2 に答える 2

0

示されたディレクトリ構造は、書き込む必要があることを示しています

#include <SFML/include/Graphics.hpp>

これにより、エラーが説明されます。

于 2013-02-06T22:28:34.293 に答える
0

長い答え

インクルードのチェーンを通じて、アプリケーション プロジェクトのmain.cppは間接的に「engine/assets/asset.hpp* からengine/engine.hppをインクルードします。したがって、アプリケーション プロジェクトのビルド中に、asset.hppは SFML ライブラリをインクルードしようとしました。そして見つけることができませんでした。

engine.cpp (およびその他の実装ファイル) に SMFL ヘッダーを含めることができる理由は、依存関係が構成されているライブラリ プロジェクトのビルド中にそれらの依存関係がリンクされるためです。外部ライブラリからの実装に必要なものはすべて、結果のEngine.libファイルに含まれています。

TL;DR

簡単に言えば、問題は、ソリューションがエンジン ライブラリとアプリケーション実行可能ファイルの 2 つのプロジェクトに分割されたことです。前者は SFML ライブラリにアクセスするように設定されていましたが、後者はそうではありませんでした。

修理

解決策は、アプリケーション プロジェクトの構成に外部ライブラリを含めるか、ヘッダー ファイルでライブラリの依存関係を公開する際により注意を払うことです。

残念ながら、元の質問で問題を特定するために必要な詳細を投稿しなかったため、問題を明らかにするのに役立つ CMakeLists.txt ファイルの内容を追加しました。

于 2013-02-07T00:43:28.847 に答える