CMake - 奇怪的包括目录

时间:2014-11-27 16:39:46

标签: c++ compilation linker cmake

我创建了一个项目,该项目由main.cpp文件和另一个类(名为Physical)组成,该类被分解为Physical.hpp文件和Physical.cpp文件。

项目文件结构如下所示:

main.cpp
header/Physical.hpp
src/Physical.cpp

该项目编译良好,但前提是我以不同的方式包含Physical.hpp,具体取决于我是否包括Physical.cpp或main.cpp文件。

从主文件中,我必须使用:

#include "header/Physical.hpp"

然而,我必须使用Physical.cpp文件:

#include "../header/Physical.hpp"

为什么会出现这种差异?我希望它与我的cmake配置文件有关,虽然我真的不确定。下面是我的cmake配置文件。

cmake_minimum_required(VERSION 2.8.4)
project(gravity_simulator ${PROJECT_BINARY_DIR})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp src/Physical.cpp)
include_directories("${PROJECT_BINARY_DIR}")
add_executable(gravity_simulator ${SOURCE_FILES})

# Detect and add SFML
set(CMAKE_MODULE_PATH "/usr/share/SFML/cmake/Modules/" ${CMAKE_MODULE_PATH})
#Find any version 2.X of SFML
#See the FindSFML.cmake file for additional details and instructions
find_package(SFML 2 REQUIRED system window graphics network audio)
if(SFML_FOUND)
  include_directories(${SFML_INCLUDE_DIR})
  target_link_libraries(gravity_simulator ${SFML_LIBRARIES})
endif()

1 个答案:

答案 0 :(得分:0)

一切都按预期工作。

对于您的main.cpp文件,标题位于header/Physical.hpp,而Physical.cpp标题位于../header/Physical.hpp

这里的错误是,你认为相对路径总是从特定的直接开始,而每个源文件(*.cpp)都是独立编译的,因此每个文件都独立地进行标题搜索。 / p>

就个人而言,如果我不编写库,我只需将所有源文件和头文件放在src目录中,一切都会好的。但是,如果我正在编写库,我使用<header.hpp>样式并将头目录添加到include目录(include_directories("header"))。通常将事物拆分为头文件和源文件的全部原因是,当一个人发布库时,可以很容易地发送头文件,而不是在源文件之间手动过滤它们。

tl; dr 编写应用程序时,将所有内容都放在源目录中。在编写库时,使用<>作为包含,将头目录添加到包含目录。