我有一个程序,它使用静态或共享库。现在我想做一些像
这样的事情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
当然,终端会发出一些警告。它运作良好,但我不这么认为 很漂亮:)。如何让它更好?
答案 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 $@
一旦您对这些内容感到满意,就可以进一步改进。