- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我修改了 gcc/g++ option to place all object files into separate directory发布我的场景。但是,在运行 make link
时返回错误。
项目树
|--- bin
| |--- main
|--- obj
| |--- object1.o
| |--- object2.o
| |--- ...
|--- src
| |--- source1.cpp
| |--- source2.cpp
| |--- ...
|--- main.cpp
生成文件
SRCDIR = ./src
OBJDIR = ./obj
BINDIR = ./bin
INCDIR = ./src
CC = g++
EXEC = main
SRC = $(wildcard $(SRCDIR)/*.cpp main.cpp)
OBJ = $(addprefix $(OBJDIR)/,$(notdir $(SRC:.cpp=.o)))
compile: $(OBJ)
$(OBJ): $(SRC)
$(CC) -c $< -o $@
link:
$(CC) -o $(EXEC) $(OBJ)
clean:
find -type f -name "$(EXEC)" -delete
find -type f -name "*.o" -delete
find -type f -name "*~" -delete
例如:
主要.cpp
#include <iostream>
#include "Source.h"
using namespace std;
int main(int argc, char* argv[]) {
Source::hello();
return 0;
}
来源.h
#include "Source.h"
#ifndef SOURCE_H
#define SOURCE_H
#include <iostream>
using namespace std;
class Source {
public:
static void hello();
};
#endif
源.cpp
#include "Source.h"
void Source::hello() {
cout << "Hello Makefile" << endl;
}
编译
ok!创建所有对象(obj/*.o)
问题:建立链接
错误:
g++ -o main ./obj/Source.o ./obj/main.o
./obj/main.o: In function `Source::hello()':
Source.cpp:(.text+0x0): multiple definition of `Source::hello()'
我知道问题所在
g++ -c src/Source.cpp -o obj/Source.o
g++ -c src/Source.cpp -o obj/main.o.
不知道怎么解决。知道哪里出了问题吗?
最佳答案
这可能不是完美的解决方案,但它有效:
SRCDIR = ./src
OBJDIR = ./obj
BINDIR = ./bin
INCDIR = ./src
CC = g++
EXEC = main
SRC = $(wildcard $(SRCDIR)/*.cpp main.cpp)
OBJ = $(addprefix $(OBJDIR)/,$(notdir $(SRC:.cpp=.o)))
CXX_FLAGS = -I $(INCDIR) -Wall
.PHONY : compile
compile: $(OBJ)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
$(CC) -c $(CXX_FLAGS) $< -o $@
$(OBJDIR)/main.o: main.cpp
$(CC) -c $(CXX_FLAGS) $< -o $@
.PHONY : link
link: compile
$(CC) -o $(EXEC) $(OBJ)
.PHONY : clean
clean:
find -type f -name "$(EXEC)" -delete
find -type f -name "*.o" -delete
find -type f -name "*~" -delete
请注意,我制定了一个自动规则来编译所有 SRCDIR
来源,然后是 main
的特殊规则, 自 main
不在同一个目录中,所以第一条规则不起作用。
我还添加了 .PHONY
对于 compile
, link
和 clean
,因为那些不是“真正的目标”,它们只是用来告诉 make 你想做什么的名字。没关系,直到某个时候你碰巧有一个名为 compile
的文件。 , link
或 clean
在目录中 - 此时,您的 makefile 突然无法正常工作(例如,它不“编译”,因为目录中有一个名为 compile 的文件,并且 compile
不依赖于其他任何东西,所以根据 make 没有什么可做的)。
(为了我自己的利益,我还为 compile
添加了对 link
的依赖,所以我不必输入 make clean compile link
,但可以只使用 make clean link
)。
如评论中所述,问题是由 $<
引起的被扩展为“规则中的第一个元素”,它始终是 srcdir/Source.cpp
,而不是“与目标文件对应的任何源。
我认为可以使用例如 VPATH
来做一些事情或者也许 $(<F)
变量......但我现在不知道怎么做。
关于c++ - Makefile 当 srcdir != objdir,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18806681/
基本设置 Ant 新手;苹果系统 我想做什么 https://github.com/MIT-DB-Class/course-info-2017/blob/master/lab1.md#1-gettin
为什么 sourceSets.generated.java.srcDirs 的路径是“generated-src/antlr/main”而不是“generated-src/antlr”? 来自 doc
我需要为每种构建类型执行android测试用例。因此,“androidTest.java.srcDirs”对于每种构建类型将具有不同的值。 对于buildType 1: androidTest.jav
我修改了 gcc/g++ option to place all object files into separate directory发布我的场景。但是,在运行 make link 时返回错误。
我正在开发一个具有多种风格的 android 应用程序,如下所示: sourceSets { main { res.srcDirs += ["headend/ott/res"]
我正在尝试执行以下操作,其中 SRCDIRS 通过在 makefile 中执行以下操作来包含包含源代码的所有文件夹: SRCDIRS := $(shell find $(SRCDIR)
我是 apache ant 的新手,目前正在开发 apache Ant 项目。我刚刚开始,将项目导入工作区并尝试运行 build.xml。我将原始项目附带的所有库添加到构建路径中。我遇到以下问题。请其
有谁知道 srcDir 的包含如何在 gradle 实验文件(cpp 和 h)中工作?这是一个“三重”问题: 1°) srcDir 是如何工作的? 1.a°) 它是否递归地包含所有子目录?它只包含深层
我想基于不同的 productFlavors 构建我的应用程序的不同版本,但需要一定程度的灵 active ,但我目前还无法实现。 这是我的文件夹结构: +src +main +java
我想包含仅为测试而编译的资源。 我的应用程序模块 build.gradle 文件中包含以下内容: android { ... sourceSets { androidT
我正在尝试从 gradle 运行一个简单的最低限度的 ant 脚本。我的build.gradle只有ant import语句 ant.importBuild 'build.xml' 我的 ant bu
我接手了一个项目。 gradle配置中有一行main.java.srcDirs += 'src/main/AndroidManifest.xml'。 会导致Lint报错。 谁能给我解释一下这条线路配置
我的目录结构是src/ps/proto。我的 build.gradle 文件位于 src 目录中。我已将 sourceSets 设置为 sourceSets { ps { pr
添加后srcDir option在 nuxt.config.js 文件中,我已将页面、组件和布局文件夹移动到 src 目录。这是我的配置: module.exports = { srcDir: '
我正在尝试在 Dockerfile 中构建 swig。但是,当我尝试运行 ./configure 时,我收到一条错误消息,指出未找到它,尽管它确实存在。 这是使用 Dockerfile 安装 swig
我有一个多项目构建,并且我在 master build.gradle 中包含了 groovy 插件像这样: plugins { id 'groovy' } 但是,我的一个具有 groovy 资源的
我刚刚从 Bumblebee 升级到 Chipmunk,并且在我的仪器化 androidTests 中遇到了多个依赖关系解析问题。 这些是我的源集的样子: sourceSets { test.
我是一名优秀的程序员,十分优秀!