访问当前 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.cpp
和 Logger.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
- 我是否需要将 CMakeLists.txt 添加到每个子目录,每个
a
和 utils
一个?
- 我不能只有一个 parent 来管理我可以为每个文件包含哪些文件吗?
- 我想从
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 而不是来源。
我正在尝试使用 CMake 建立一个简单的 C++ 项目。我试图从 a/A.cpp
文件中包含位于 utils
文件夹下的 Logger.h
header。目前,我无法配置我的 A.cpp
文件访问 utils/Logger.h
header 文件。我在 CMakeLists.txt
文件的可执行文件中有 A.cpp
和 Logger.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
- 我是否需要将 CMakeLists.txt 添加到每个子目录,每个
a
和utils
一个? - 我不能只有一个 parent 来管理我可以为每个文件包含哪些文件吗?
- 我想从
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 而不是来源。