gpt4 book ai didi

c++ - Makefile 当 srcdir != objdir

转载 作者:行者123 更新时间:2023-11-30 04:14:37 27 4
gpt4 key购买 nike

我修改了 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 , linkclean ,因为那些不是“真正的目标”,它们只是用来告诉 make 你想做什么的名字。没关系,直到某个时候你碰巧有一个名为 compile 的文件。 , linkclean在目录中 - 此时,您的 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/

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