未找到包含子目录的 Makefile headers
Makefile with subdirectories does not find headers
我有以下目录结构(在 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 文件中包含的 header 文件。所以我把 header 包含在 another.cpp 中,像这样:
#include "src/headers/another.hpp"
命令 make cross 给我这个错误信息:
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 在这样的位置查找 header 文件:
MyProject/src/sources/src/headers/
我的假设正确吗?我能做些什么来解决这个问题?
希望有人能够帮助我。提前谢谢你。
您忘记告诉您的编译器在本地目录中查找(-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)
我有以下目录结构(在 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 文件中包含的 header 文件。所以我把 header 包含在 another.cpp 中,像这样:
#include "src/headers/another.hpp"
命令 make cross 给我这个错误信息:
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 在这样的位置查找 header 文件:
MyProject/src/sources/src/headers/
我的假设正确吗?我能做些什么来解决这个问题? 希望有人能够帮助我。提前谢谢你。
您忘记告诉您的编译器在本地目录中查找(-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)