【问题标题】:CMake - Weird Include DirectoriesCMake - 奇怪的包含目录
【发布时间】:2014-11-27 16:39:45
【问题描述】:

我创建了一个项目,其中包含一个 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()

【问题讨论】:

  • 您应该尝试添加文件(GLOB HEADER_FILES "${CMAKE_SOURCE_DIR}/header/*.hpp") 来收集标题。并 include_directories(${CMAKE_SOURCE_DIR}/header) 提供搜索路径。不要忘记你的目标并指定 headers 变量 add_executable(gravity_simulator ${SOURCE_FILES} ${HEADER_FILES})
  • @AlexanderBorodulya 在 CMake 中不赞成对源文件或头文件进行通配。有关原因的概述,请参阅stackoverflow.com/a/18538444/393701。另外,不需要列出头文件,因为 CMake 可以通过分析源文件自动检测包含文件的依赖关系。

标签: c++ compilation linker cmake


【解决方案1】:

一切都按预期进行。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多