CMake - 奇怪的包含目录

CMake - Weird Include Directories

本文关键字:包含目 CMake      更新时间:2023-10-16

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

项目文件结构如下所示:

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

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

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

#include "header/Physical.hpp"

然而,从物理.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()

一切都按预期工作。

对于main.cpp文件,标头位于header/Physical.hpp,而对于Physical.cpp,标头位于../header/Physical.hpp

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

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

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