1, 目标
使用两种方式生成可执行程序,一种是直接使用clang作为编译器驱动程序,完成整个应用程序的自动构建:
clang a.c b.c c.c -o abc.out
另一种,先生成字节码,再链接字节码,然后将链接成功的 字节码文件生成为 obj文件,最后将obj文件链接成可执行程序。
2,示例
示例如下:
Makefile
EXE :=hello_world hello
all: $(EXE)
hello_world:hello_world.c sum.c
clang $^ -o $@
hello.linked.bc: hello_world.bc sum.bc
llvm-link $^ -o $@
%.bc: %.c
clang -emit-llvm -c $< -o $@
hello.linked.o:
%.o: %.bc
llc -filetype=obj $< -o $@
hello: hello.linked.o
clang $^ -o $@
.PHONY: clean
clean:
${RM} $(EXE) *.o *.bc
hello_world.c
cpp
#include <stdio.h>
#include "sum.h"
int main()
{
int r = sum(3, 4);
printf("Hewllo world! r=%d\n", r);
return 0;
}
sum.c
cpp
int sum(int x, int y)
{
return x+y;
}
sum.h
cpp
int sum(int x, int y);
3,运行
make
make hello
make hello_world
如果在其中 clang hello.linked.o -o hello 这一步里,直接调用ld程序做链接,那么需要加入很多链接库参数:
测试 直接ld:
需要含如下 系统obj文件:
ld-linux-x86-64.so.2
crt1.o
crti.o
crtbegin.o
libstdc++.a
libm.a
libgcc_s.a
libgcc.a
libc.a
crtend.o
crtn.o关于 ld 的更多参考:
ld(1) - Linux manual page
Binutils- GNU Project - Free Software Foundation
https://en.wikipedia.org/wiki/Linker_%28computing%29
如果遇到了多个互相依赖的库的链接顺序问题,则可以考虑使用--start-group 和 --end-group标志。
4,llvm-config 示例
llvm-config 打印构建程序时需要与llvm库链接的信息,例如:
llvm-config --cxxflags 将打印用于C++程序的标志,来链接llvm库: