CMake - 奇怪的包含目录
CMake - Weird Include Directories
我创建了一个项目,该项目由一个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 编写应用程序时,将所有内容都放在源目录中。编写库时,请使用包含<>
将头目录添加到包含目录。
相关文章:
- 在CMake中使用find_package时,是否会显式包含标头
- 如何在 cmake 库中包含 libcurl
- Visual Studio 中的 CMake 项目:如何添加其他包含和库目录?
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- CMake 将库包含在另一个库中
- GCC 包含标头(使用"-include")CMake 未检测到的更改
- 以现代 CMake 方式控制包含的库中的构建选项(测试等)
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- CMake 导入本地共享库以及如何将其包含在标头中
- CMake 包支持 - 找不到包含和库
- CMake 如何强制third_party库将项目文件包含在当前项目源目录中?
- CMake 包含非 cmake 库的第三方标头
- cmake 可以包含具有头文件和库文件但没有 .cmake 文件的库吗?
- 我怎样才能简单地将opencv 包含在我的项目中与CMake
- 我的项目中某些仅标头文件不能包含使用 CMake 和 Vscode 的"SFML/Graphics.hpp"
- 如何找到 -lm lib 并将其包含在 CMake 中?
- 为什么我无法包含来自 cmake 导出/导入库的头文件
- 如何在 Linux 上将所有第三方运行时依赖项包含在 cmake/cpack 生成的包中
- 将 MySQL 包含在 cmake 中