4

所以,我正在编写一个程序来测试某些数据结构的效率。我有所有的 .h 文件,并且我制作了一个非常糟糕的 makefile,它可能是错误的,尽管它似乎在一定程度上起作用。它不是生成 .o 文件,而是生成 .gch 文件,因此当它尝试访问所有 .o 文件时,它们不会被找到。这是我的makefile

prog1: main.o dsexceptions.o BinarySearchTree.o SplayTree.o RedBlackTree.o AvlTree.o
                g++ -Wall -g -o prog1 main.o dsexceptions.h.gch BinarySearchTree.h.gch SplayTree.h.gch RedBlackTree.h.gch AvlTree.h.gch

main.o: main.cpp AvlTree.h RedBlackTree.h SplayTree.h BinarySearchTree.h dsexceptions.h
                g++ -Wall -g -c main.cpp

#shape.o: shape.cpp shape.h grid.h
#               g++ -Wall -g -c shape.cpp

dsexceptions.o: dsexceptions.h
                g++ -Wall -g -c dsexceptions.h

BinarySearchTree.o: BinarySearchTree.h dsexceptions.h
                    g++ -Wall -g -c BinarySearchTree.h

SplayTree.o: SplayTree.h dsexceptions.h
             g++ -Wall -g -c SplayTree.h

RedBlackTree.o: RedBlackTree.h dsexceptions.h
                g++ -Wall -g -c RedBlackTree.h

AvlTree.o: AvlTree.h dsexceptions.h
           g++ -Wall -g -c AvlTree.h

clean:
                rm -f main main.exe  main.o dsexceptions.o BinarySearchTree.o SplayTree.o RedBlackTree.o AvlTree.o *.gch
4

3 回答 3

19

您不想将 .h 文件提供给编译器。仅编译 .cpp 文件,该文件应包含您的 .h 文件。(.gch 文件是预编译的头文件。)您的头文件不需要 .o 文件,只需将它们#include 到您的 .cpp 文件中即可。

prog1: main.o
        g++ -Wall -g -o prog1 main.o

main.o: main.cpp AvlTree.h RedBlackTree.h SplayTree.h BinarySearchTree.h dsexceptions.h
        g++ -Wall -g -c main.cpp

clean:
        rm -f prog1 main.o
于 2009-09-25T03:59:18.280 回答
1

您已经从 bstpierre 获得了解决方案,但为了好玩,这里是我的 makefile 版本:

CC = g++ -墙 -g -o $@

MODULE = AvlTree BinarySearchTree RedBlackTree SplayTree
对象 = $(添加后缀 .o,$(MODULES))

prog1: main.o dsexceptions.o $(OBJECTS)
       $(抄送) $^

main.o: $(添加后缀 .h,$(MODULES))

$(OBJECTS) main.o : %.cpp %.h dsexceptions.h
    $(CC) -c $<

干净的:
 rm -f main main.exe *.o *.gch
于 2009-09-25T21:01:56.123 回答
1

只是为了更好的衡量,这是我的 SConstruct,因为 SCons 好多了:)

Program('main.cpp') # Yeah, it's that simple :)

您可以在此处查看 SCons 。

于 2009-10-01T18:40:12.383 回答