从一个makefile中的一个代码创建多个项目

时间:2017-03-17 17:25:36

标签: c makefile

我有一个程序,它使用静态或共享库。现在我想做一些像

这样的事情
make static

make shared

在两种情况下编译项目。 我的Makefile看起来像

shared: main.o libresult.so
        gcc -o shared main.o -L. -lresult -Wl,-rpath,.

main.o: main.c
        gcc -c main.c

libresult.so: func.o 
        gcc -shared -o libresult.so func.o

func.o: func.c
        gcc -c -fPIC func.c

static: main.o libresult.a
        gcc -o static main.o -L. -lresult

main.o: main.c
        gcc -c main.c

libresult.a: func.o 
        ar cr libresult.a func.o 

func.o: func.c
        gcc -c func.c

clean:
        rm -f *.o *.a *.so static shared

当然,终端会发出一些警告。它运作良好,但我不这么认为 很漂亮:)。如何让它更好?

1 个答案:

答案 0 :(得分:1)

1)您有两份main.o规则副本:

main.o: main.c
    gcc -c main.c

删除其中一个。

2)您有func.o规则的两个版本:

func.o: func.c
    gcc -c -fPIC func.c

func.o: func.c
    gcc -c func.c

这是一个更严重的问题。您放入共享库(libresult.so)的对象必须使用-fPIC进行编译;放在静态库中的对象(libresult.a可以用-fPIC编译,但是没有理由这样做,这可能会阻止编译器执行某些优化。 Make不知道你的意图,所以最好用不同的名字制作两个版本的对象:

func_so.o: func.c
    gcc -c -fPIC func.c -o func_so.o

func_a.o: func.c
    gcc -c func.c -o func_a.o

(不要忘记修改依赖这些对象的规则。)

3)使用automatic variables减少冗余并使makefile更清晰。例如:

main.o: main.c
    gcc -c $< -o $@

一旦您对这些内容感到满意,就可以进一步改进。