clang llc llvm-link llvm-config 应用示例

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库:

相关推荐
juesdo4 分钟前
vulnos OS-00118靶场通关
linux·web安全·网络安全·docker
叠层归一研究院5 分钟前
如何用程序搭建一个 AGI 种子系统(三):生长如何对接物理与数学宇宙
人工智能·python·算法·机器学习·transformer·agi
霸刀11 分钟前
nslookup 与 dig 使用指南:DNS 查询、区别对比及真实案例解读
linux·cdn·dns
郝亚军16 分钟前
asqlite-autoconf-3310100 的ubuntu 22.04 aarch64交叉编译
linux·运维·ubuntu
江畔柳前堤23 分钟前
AgentScope 设计与原理全解:从消息原语到分布式智能体工程底座
大数据·人工智能·分布式·目标检测·机器学习·语言模型·架构
笑锝没心没肺39 分钟前
Linux安装docker及运行容器测试
linux·运维·docker
Mr_liu_6661 小时前
Claude非专业入门实战笔记(附录):关闭Telemetry-遥测,消除无用网络请求与日志噪音
linux·笔记·ubuntu·ai编程
时空无限1 小时前
ubuntu apt 查看软件之间的依赖
linux·运维·ubuntu
Escalating_xu1 小时前
【Linux】线程概念与控制:从地址空间、LWP 到 pthread_create、join、detach 与 NPTL
java·linux·redis
Escalating_xu1 小时前
【Linux】进程信号:从产生、阻塞与递达到 sigaction、可重入与内核返回路径
linux·运维·面试·职场和发展