我可以使用CMake分阶段编译程序吗?
我正在使用LLVM编译器执行一些分析。我还编写了一个使用CMake构建的测试应用程序。我想分阶段编译测试应用程序:我可以使用CMake分阶段编译程序吗?,cmake,clang,llvm,llvm-ir,Cmake,Clang,Llvm,Llvm Ir,我正在使用LLVM编译器执行一些分析。我还编写了一个使用CMake构建的测试应用程序。我想分阶段编译测试应用程序: 将测试应用程序的所有源文件编译为LLVM位代码 使用llvm-Link将所有位代码文件链接在一起 将此链接的位代码文件向下编译为实际的二进制文件(使用额外的标志来运行我的分析) 例如,如果我有一个由3个文件组成的程序test,foo.c,bar.c,和bar.h: Normal compilation: clang -I. -c foo.c // generates foo
llvm-Link
将所有位代码文件链接在一起test
,foo.c
,bar.c
,和bar.h
:
Normal compilation:
clang -I. -c foo.c // generates foo.o
clang -I. -c bar.c // generates bar.o
ld -lc -lgcc -o test foo.o bar.o // links foo.o and bar.o
Bitcode compilation & linking:
clang -I. -c -emit-llvm foo.c // generates foo.bc
clang -I. -c -emit-llvm bar.c // generates bar.bc
llvm-link -o test.bc foo.bc bar.bc // links foo.bc and bar.bc
clang -I. -o test test.bc // generates test
正如我所说,我已经编写了CMake文件,这些文件可以正常地构建和编译测试应用程序(即,在单个阶段)
通过添加自定义命令和/或目标的某种组合,是否有可能实现这样的目标?或者我应该继续使用bash/Python脚本来运行这个过程吗?我不明白其中的区别。如果手动执行,命令会是什么?@usr1234567:在正常编译中,不会生成和/或链接位代码文件(
*.bc
);相反,LLVM生成对象文件(*.o
)。然后通过您常用的链接器工具(例如,ld
)链接这些文件,而不是llvm-link
,它显式链接位码(llvm-IR)文件。@usr1234567:我添加了一个粗略的示例来说明我正在尝试做的事情。其基本原理是示例中的test.bc
文件将包含test
中的所有函数。在这一点上,我可以进行其他不可能的分析。也许有帮助。@Darklighter:很有趣!谢谢你的链接——如果有,我会到处看看,让你知道(如果有,我会请你把它变成一个答案)。