我的简单g ++ Makefile有什么问题?

时间:2011-12-01 21:47:07

标签: c++ makefile

我有一个头文件sieve.h,它没有cpp文件。以下是我现在对makefile的看法:

bitarray_executable: bitarray.o sieve.o main.o
    g++ -o bitarray.out bitarray.o sieve.o main.o

sieve.o: sieve.h
    g++ -o sieve.o -c sieve.h

main.o: main.cpp bitarray.h sieve.h
    g++ -o main.o -c main.cpp

clean:
    rm -f *.o bitarray

我做错时收到错误:

g++ -o sieve.o -c sieve.h
sieve.h:15: error: expected `)' before ‘&’ token
make: *** [sieve.o] Error 1

这是Sieve:

#ifndef _SIEVE_H
#define _SIEVE_H

#include <iostream>

#include "bitarray.h"
using namespace std;

class Sieve
{
 public:
  Sieve(BitArray& x)
    {
      for (int i = 0; i < x.Length; i++)
        x.Set(i);
    }

};

#endif

任何人都有更多编写makefile的经验告诉我这有什么问题吗?

2 个答案:

答案 0 :(得分:3)

您正在编译头文件

删除

sieve.o: sieve.h
    g++ -o sieve.o -c sieve.h

答案 1 :(得分:1)

.o文件是从.cpp或.c或.c ++之类的文件中编译的 假设sieve.h包含在main.cpp中,因为你声明它没有.cpp,那么没有什么可以为它编译,但你可以像main.o那样指定其他的依赖规则

你没有关于bitarray的细节,所以我假设这是一个提供的目标文件,或者遵循默认/隐含的规则来制作.o

因此你的make文件可以简化为(这几乎就是fazo所拥有的)

bitarray_executable: bitarray.o main.o
    g++ -o bitarray.out bitarray.o main.o

main.o: main.cpp bitarray.h sieve.h
    g++ -o main.o -c main.cpp

clean:
    rm -f *.o bitarray

进一步整理,假设制作.o文件的默认规则

objects := $(patsubst %.cpp,%.o,$(wildcard *.cpp))

bitarray_executable: bitarray.out

bitarray.out: $(objects)
    g++ -o bitarray.out $(objects)

main.o: main.cpp bitarray.h sieve.h

clean:
    rm -f *.o bitarray.out