带有子目录的Makefile找不到标题

问题描述 投票:0回答:1

我具有以下目录结构(在Ubuntu上:)

MyProject/
    Here is my Makefile
MyProject/src/headers
    Here are more subfolders and .hpp files
MyProject/src/sources
    Here are two .cpp files (main.cpp and another.cpp)

所以我用this教程编写了我的makefile,看起来像这样:

cppsrc = $(wildcard src/sources/*.cpp)
obj = $(cppsrc:.cpp=.o) 
flags = -I/usr/include/boost_1_72_0/ -pthread 

cross: $(obj)   
      i686-atom-linux-gnu-g++ -o $@ $^ $(flags)

它检测子目录中的.cpp文件(是!)。但是它不会检测到.cpp文件中包含的头文件。因此,我将头文件包含在another.cpp中,如下所示:

#include "src/headers/another.hpp"

命令交叉命令给我这个错误消息:

g++    -c -o src/sources/another.o src/sources/another.cpp
src/sources/another.cpp:6:10: fatal error: src/headers/another.hpp: No such file or directory
 #include "src/headers/another.hpp"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
<builtin>: recipe for target 'src/sources/another.o' failed
make: *** [src/sources/another.o] Error 1

错误消息使我相信makeapp在这样的位置查找头文件:

MyProject/src/sources/src/headers/

我的假设正确吗?我该怎么解决?希望有人能够帮助我。预先谢谢你。

c++ makefile compilation cross-compiling
1个回答
0
投票
您忘了告诉编译器查看本地目录(-I.),但还有一个更严重的问题:您正在使用HOST编译器编译文件,并将它们与CROSS编译器链接在一起。这将导致错误。

要修复它,您需要设置默认COMPILE.cc规则中使用的变量,定义如下:

COMPILE.cpp = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c %.o: %.cpp # commands to execute (built-in): $(COMPILE.cpp) $(OUTPUT_OPTION) $<

所以在您的情况下:

CXX = i686-atom-linux-gnu-g++ CXXFLAGS += -I. -I/usr/include/boost_1_72_0/ LDFLAGS += -lpthread cppsrc = $(wildcard src/sources/*.cpp) obj = $(cppsrc:.cpp=.o) cross: $(obj) $(CXX) -o $@ $^ $(LDFLAGS)

© www.soinside.com 2019 - 2024. All rights reserved.