c++ - Makefile 中的多个跃点

标签 c++ c makefile

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

相关文章:

C++ 使用标准 :string v char* in a base class - base class has a redudant copy of the string

.net - 寻找visual studio.NET C++的各种Windows Form教程

c++ - 如何确保在 C++ 中覆盖(隐藏)派生类中的方法?

c - 将字符串添加到链表会导致段错误

c - Makefile:不确定如何使用变量制作一个好的 makefile

makefile - 如何让 CMake 使用现有的 Makefile?

c++ - 项目编译错误 - 找不到 -lwxmsw28

c - 将十六进制从 .txt 转换为 C 中的数组/字符串

c - 替换#defines常量

c++ - omn​​iorb makefile 服务器错误