- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在为位于 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/
我从 http://alchim31.free.fr/m2e-scala/update-site/ 安装了 Maven Scala 支持,以及使用 Eclipse Marketplace 的 Scal
我正在尝试将 sbt 与 IntelliJ Idea 一起使用。当sbt 0.13.8刷新项目时,会在src/main->'scala'和'scala-2.11'下创建两个scala源码目录 我的 S
我有一个 Maven 项目(在 Eclipse 中使用 m2eclipse 插件),它包含两种不同语言(Java 和 Clojure)的代码。 理想情况下,我想要两种语言的两个单独的源文件夹: 源代码
我正在尝试将 Cordova 3.4 与 AngularJS 结合使用。我关注了this tutorial有时它要求我更改 ant.properties 文件中的 html.source.dir 和
在 Eclipse 平台(Windows 10,MinGW 工具链)中,我正在尝试创建一个生成文件来编译带有 .cpp 和 .hpp 文件的项目。 为此,我选择创建一个新项目: 文件-> (弹出)新项
我有一个项目,其中 Java 源代码未处于 Gradle 期望的标准位置。 如何将 Gradle 指向正确的目录? 最佳答案 如果 src/main/java 中没有源代码,那么这样做会更正确 sou
我有一个旧的 Web 应用程序项目。然后我添加了pom.xml,并添加了maven-war-plugin。在旧项目中,源代码位于 “Java Resources/src” 目录中。 在我的 maven
我正在尝试使用 Lombok Maven Plugin以确保在使用 Lombok 时正确创建 Javadocs . Lombok Maven 在编译之前引入了一个新的代码生成目标。在我的配置中,我的
我使用的库的构建过程不会将源 Artifact 部署到它所在的 Maven 存储库。修改构建过程超出了我的控制范围。 但是,我可以访问该库的 git 存储库(及其源代码)。我还可以将此存储库克隆到我的
我是一名优秀的程序员,十分优秀!