Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用CMake分阶段编译程序吗?_Cmake_Clang_Llvm_Llvm Ir - Fatal编程技术网

我可以使用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编译器执行一些分析。我还编写了一个使用CMake构建的测试应用程序。我想分阶段编译测试应用程序:

  • 将测试应用程序的所有源文件编译为LLVM位代码
  • 使用
    llvm-Link
    将所有位代码文件链接在一起
  • 将此链接的位代码文件向下编译为实际的二进制文件(使用额外的标志来运行我的分析)
  • 例如,如果我有一个由3个文件组成的程序
    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:很有趣!谢谢你的链接——如果有,我会到处看看,让你知道(如果有,我会请你把它变成一个答案)。