我有一个头文件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的经验告诉我这有什么问题吗?
答案 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