gpt4 book ai didi

c++ - Makefile 中的多个跃点

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:27 28 4
gpt4 key购买 nike

我有一个 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.oX.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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com