gpt4 book ai didi

c++ - 来自一个源目录的 Makefile 试图从其他目录访问 cpp 文件

转载 作者:行者123 更新时间:2023-11-30 05:15:21 24 4
gpt4 key购买 nike

我在为位于 2 个不同目录中的 cpp 文件创建对象时遇到问题,如下所示:

- Project-xyz
- Hello
- Hello.cpp
- World
- Main.cpp
- World.cpp
- Makefile

为了更清楚起见,这里是代码的外观(只是一个虚拟代码)。

你好/Hello.h

#ifndef HELLO_H
#define HELLO_H

void HelloPrint();

#endif // HELLO_H

你好/ hell .cpp

#include <iostream>
#include "Hello.h"

void HelloPrint()
{
std::cout <<"Hello" << std::endl;
}

世界/世界.h

 #ifndef WORLD_H
#define WORLD_H

void WorldPrint();

#endif // WORLD_H

世界/世界.cpp

#include <iostream>
#include "World.h"

void WorldPrint()
{
std::cout <<"World!" << std::endl;
}

世界/生成文件使用 here 中给出的 makefile .哪个工作正常。但它不会创建任何 obj 文件。

# set non-optional compiler flags here
CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic-errors

# set non-optional preprocessor flags here
# eg. project specific include directories
CPPFLAGS +=

# find cpp files in subdirectories
SOURCES := $(shell find . -name '*.cpp')
SOURCES += $(shell find ../hello -name '*.cpp')

# find headers
HEADERS := $(shell find . -name '*.h')

OUTPUT := HelloWorld

# Everything depends on the output
all: $(OUTPUT)

# The output depends on sources and headers
$(OUTPUT): $(SOURCES) $(HEADERS)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(OUTPUT) $(SOURCES)

clean:
$(RM) $(OUTPUT)

我正在寻找一种解决方案,它使用生成文件在特定目录中生成 obj 文件,如图所示 here .

现在我正在尝试使用下面的 make 文件为 world/objdir/hello.o 中的 hello/hello.cpp 文件生成 obj 文件。这是行不通的。如何让它发挥作用?

世界/生成文件

GCC=g++
CPPFLAGS=-c -Wall
LDFLAGS=
OBJDIR=objdir
OBJ=$(addprefix $(OBJDIR)/, $(patsubst %.cpp, %.o, $(wildcard *.cpp)))
TARGET=HelloWorld

.PHONY: all clean

all: $(OBJDIR) $(TARGET)

$(OBJDIR):
mkdir $(OBJDIR)

$(OBJDIR)/%.o: %.cpp
$(GCC) $(CPPFLAGS) -c $< -o $@
$(TARGET): $(OBJ)
$(GCC) $(LDFLAGS) -o $@ $^
clean:
@rm -f $(TARGET) $(wildcard *.o)
@rm -rf $(OBJDIR)

当我尝试运行 make 时,它​​抛出以下错误。

g++ -c -Wall -c main.cpp ../hello/Hello.cpp -o objdir/main.o
g++: fatal error: cannot specify -o with -c, -S or -E with multiple files
compilation terminated.
make: *** [objdir/main.o] Error 4

它无法为 hello/Hello.cpp 文件生成 obj 文件,因此抛出此错误。

感谢 makefile 大师的任何帮助! :)

最佳答案

添加 vpath %.cpp ../hello 以及@gaoithe 的解决方案已经解决了这个问题。

vpath %.cpp ../hello
GCC=g++
CPPFLAGS=-c -Wall
LDFLAGS=
OBJDIR=objdir
OBJ=$(addprefix $(OBJDIR)/, $(patsubst %.cpp, %.o, $(wildcard *.cpp)))
OBJ+=$(addprefix $(OBJDIR)/, $(patsubst %.cpp, %.o, $(notdir $(wildcard ../hello/*.cpp))))
TARGET=HelloWorld

.PHONY: all clean

all: $(OBJDIR) $(TARGET)

$(OBJDIR):
mkdir $(OBJDIR)

$(OBJDIR)/%.o: %.cpp
$(GCC) $(CPPFLAGS) -c $< -o $@
$(TARGET): $(OBJ)
$(GCC) $(LDFLAGS) -o $@ $^
clean:
@rm -f $(TARGET) $(wildcard *.o)
@rm -rf $(OBJDIR)

现在

$ ls objdir/
Hello.o main.o World.o

专家需要评估新的 makefile 并确认这是否是一个可扩展的解决方案?

非常感谢任何关于优化/增强当前 makefile 和帮助减少构建时间的意见。

关于c++ - 来自一个源目录的 Makefile 试图从其他目录访问 cpp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43140506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com