【问题标题】:Include header file in different directory in c++在c ++中包含不同目录中的头文件
【发布时间】:2016-11-04 20:22:45
【问题描述】:

我一直在学习c++,遇到以下问题: 我有一个像这样的目录结构:

 - current directory

  - Makefile

  - include

     - header.h

  - src

      - main.cpp

我的 header.h :

#include <iostream> 

using namespace std;

void print_hello();

我的 main.cpp:

#include "header.h"

int main(int argc, char const *argv[])
{
    print_hello();
    return 0;
}

void print_hello()
{
    cout<<"hello world"<<endl;
}

我的 Makefile:

CC = g++
OBJ = main.o
HEADER = include/header.h 
CFLAGS = -c -Wall 

hello: $(OBJ) 
    $(CC) $(OBJ) -o $@

main.o: src/main.cpp $(HEADER)
    $(CC) $(CFLAGS) $< -o $@

clean: 
    rm -rf *o hello

而make的输出是:

g++ -c -Wall src/main.cpp -o main.o src/main.cpp:1:20:致命错误:header.h:没有这样的文件或目录 编译终止。 Makefile:10:目标“main.o”的配方失败 make: *** [main.o] 错误 1

我在这里犯了什么错误。这令人沮丧。非常感谢任何建议!

【问题讨论】:

  • -Iinclude/ 添加到编译器标志。
  • @πάνταῥεῖ 答案在答案部分。

标签: c++ makefile


【解决方案1】:

您可以在命令行中添加-I 选项来告诉编译器在那里查找头文件。如果你在include/ 目录中有头文件,那么这个命令应该适合你。

gcc -Iinclude/

由于您使用的是makefile,因此您可以将此选项包含在您的makefile 中的CFLAGS 宏中。

CFLAGS = -Iinclude/ -c -Wall

您可以使用#include "../include/header.h" 包含头文件。

【讨论】:

  • 它不是gcc 并且无论如何它都隐藏在 Make 变量后面,但原则上这是正确的。建议将-Iinclude 放入CFLAGS,以获得支持。
  • 我已经扩展了我的答案@LightnessRacesinOrbit
【解决方案2】:

你告诉 Makefile include/header.h 必须存在,你告诉 C++ 源文件它需要 header.h ......但你没有告诉编译器这些头文件在哪里(即在“include”目录中)。

这样做:

CFLAGS = -c -Wall -Iinclude

【讨论】:

  • @LightnessRacesinOrbit 它在哪里搜索包含文件夹?它在哪里执行?
  • @LightnessRacesinOrbit 抱歉信息太少了。我在询问 -Iinclude 标志的相关性。我实际上不明白为什么要使用它。
【解决方案3】:

也许改变你的包含行:

#include "include/header.h"

假设这是您的标头所在的位置 - 我正在从您的 makefile 中做出该假设

【讨论】:

  • 应该是#include "../include/header.h"
  • @dxiv 谢谢它的工作!但是你知道在不同目录中包含头文件的任何优雅方法吗?就像我的 main.cpp 中只需要 "#include "header.h"" 一样?
  • @J.Lin 就像@πάνταῥεῖ 所说,将-Iinclude/ 添加到编译器标志(并且可能在#include 行上将"header.h" 更改为&lt;header.h&gt;)。
猜你喜欢
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多