我有一个 C/C++ 混合项目,对于每个源代码,我想生成一个汇编文件 (.S
),然后生成一个目标文件 (.o
) 从程序集。我认为以下 Makefile 应该可以工作:
all: a.o b.o main.o
g++ $^ -o main
%.o: %.S
gcc -o $@ $<
%.S: %.c
gcc -S -o $@ $<
%.S: %.cc
g++ -S -o $@ $<
clean:
rm -rf *.o main
理想情况下,为了生成 X.o
,X.S
需要根据 X.c
或 使用其中一种规则生成>X.cpp
可用。
但是,make
显然并没有像我想象的那样工作。它采用 X.o
的默认规则,%.S: %.c
和 %.S: %.cpp
均未应用。 . make -n
给出
cc -c -o a.o a.c
g++ -c -o b.o b.cc
g++ -c -o main.o main.cc
g++ a.o b.o main.o -o main
下面的示例代码可以重现这一点:
// a.c
int a() { return 0;}
// b.cc
int b() { return 0;}
// main.cc
extern "C" int a();
extern int b();
int main() { a(); b(); return 0; }
我一定对如何解决目标有一些误解。有什么想法吗?
最佳答案
在 Makefile 顶部使用 .SUFFIXES:
到 flush predefined suffixes .工作示例:
$tail -n +1 a.c b.cc main.cc Makefile; make clean; make; ./main
==> a.c <==
#include <stdio.h>
void a(void) {
printf("a\n");
}
==> b.cc <==
#include <stdio.h>
void b(void) {
printf("b\n");
}
==> main.cc <==
extern "C" {
void a(void);
}
void b(void);
int main(void) {
a();
b();
}
==> Makefile <==
.SUFFIXES:
all: main.o a.o b.o
g++ $^ -o main # all
%.o: %.S
gcc -c -o $@ $< #o
%.S: %.c
gcc -S -o $@ $< #Sc
%.S: %.cc
g++ -S -o $@ $< #Scc
clean:
rm -rf *.o main
rm -rf *.o main
g++ -S -o main.S main.cc #Scc
gcc -c -o main.o main.S #o
gcc -S -o a.S a.c #Sc
gcc -c -o a.o a.S #o
g++ -S -o b.S b.cc #Scc
gcc -c -o b.o b.S #o
g++ main.o a.o b.o -o main # all
rm b.S main.S a.S
a
b
关于c++ - Makefile 中的多个跃点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39692095/