C++ 我的简单g++生成文件有什么问题?

C++ 我的简单g++生成文件有什么问题?,c++,makefile,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

我有一个头文件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
这是:

#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

有没有人有编写makefiles的更多经验来告诉我这有什么问题?

您正在编译头文件

删除

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

o文件是从像.CPP或.C或.C++之类的文件编译的。 假设sieve.h包含在main.cpp中,因为您声明它没有.cpp,那么就不需要为它编译任何内容,但是您可以像使用main.o一样指定其他依赖项规则

您没有关于bitarray的详细信息,因此我将假定这是一个提供的对象文件,或者遵循make.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

错误在sieve.h中,而不是makefile中。只是在中编辑了sieve.h。我不确定它在那里。我把它转换成:bitarray\u可执行文件:bitarray.o sieve.o main.o g++-o bitarray.out bitarray.o sieve.o main.o main.o:main.cpp bitarray.h sieve.h g++-o main.o-c main.cpp clean:rm-f*.o bitarray,但被告知make:**没有规则来生成目标sieve.o',bitarray\u可执行文件需要'。停止。我收到来自该文件的错误:2:**缺少分隔符。住手,别客气。这是因为不是打字而是复制和粘贴。非常感谢。