访问当前 c++ 文件范围之外的 header 个文件

Access header files outside of current c++ file scope

我正在尝试使用 CMake 建立一个简单的 C++ 项目。我试图从 a/A.cpp 文件中包含位于 utils 文件夹下的 Logger.h header。目前,我无法配置我的 A.cpp 文件访问 utils/Logger.h header 文件。我在 CMakeLists.txt 文件的可执行文件中有 A.cppLogger.h 文件,并添加了 utils 文件夹作为可执行文件的包含目录 target_include_directories(${PROJECT_NAME} PRIVATE utils a) 但我仍然无法访问 Logger.h 文件。我得到 a/A.cpp:1:10: fatal error: 'utils/Logger.cpp' file not found

  1. 我是否需要将 CMakeLists.txt 添加到每个子目录,每个 autils 一个?
  2. 我不能只有一个 parent 来管理我可以为每个文件包含哪些文件吗?
  3. 我想从a.cpp获取绝对路径#include "utils/Logger.h",如何获取?

这是我的文件夹结构

├── CMakeLists.txt
├── a
│   └── A.cpp
├── main.cpp
└── utils
    └── Logger.h

a/A.cpp

#include "utils/Logger.cpp"

class A {
public:
  void hello_a() {
    Logger logger;
    logger.print();
  }
}

utils/Logger.h

#include "iostream"

class Logger {
public:
  void print() { std::cout << "hello from Logger" << std::endl; }
}

CMakeLists.txt

project(MyProject)

cmake_minimum_required(VERSION 3.0)
add_executable(${PROJECT_NAME} main.cpp a/A.cpp utils/Logger.cppo)
target_include_directories(${PROJECT_NAME} PRIVATE utils a)

C++ 中的包含使用相对于包含目录的路径(或者源文件,如果您使用包含 ""-引号)。

对于

#include "utils/Logger.cpp"

要在 a/A.cpp 中工作,要么需要一个文件 a/utils/Logger.cpp,要么顶级目录必须是包含目录之一。

要实现后者,你可以简单地做

target_include_directories(${PROJECT_NAME} PRIVATE .)

除了包括header而不是源文件。请注意,对于 public/interface header 的导出目标,您需要替换 .,但如果是私有 header,则无关紧要。


关于 #include ""#include <> 的注释:当遇到 "" 版本时,编译器通常会查找与源文件相关的文件,如果找不到,他们会进行相同的查找至于 <> 版本。因此你永远不会看到

#include "iostream"

在任何示例中,我强烈建议不要养成使用 #include"" 版本包含标准库 header 的习惯。


另外加上一个.cpp通常表示错误;如果您想创建这样的程序或至少在代码中清楚地记录下来,请避免这样做。包括 header 而不是来源。