【问题标题】:compiling with clang and plugin使用 clang 和插件编译
【发布时间】:2017-04-27 20:11:40
【问题描述】:

clang 支持插件,这个概念通常用于构建静态分析等工具。 为了开始使用它,我使用了this example,它打印了目标 cpp 文件中存在的所有函数名称。
我编译了运行以下插件的插件:

clang++ -v -std=c++11 PrintFunctionNames.cpp \
 $(llvm-config --cxxflags --ldflags) \
 -o plugin.so -shared -Wl,-undefined,dynamic_lookup

然后“按本书”运行它:

clang++ \
 -c main.cpp \
 -Xclang -load \
 -Xclang $PWD/plugin.so \
 -Xclang -plugin \
 -Xclang print-fns

它工作得很好:它打印 main.cpp 中的函数名
然后退出(由于 -c 标志而不编译 main.cpp)。

我想做的是打印所有函数名并将 main.cpp 编译成可执行文件。
我尝试删除 -c 标志,但得到了:

/usr/bin/ld: cannot find /tmp/main-284664.o: No such file or directory

我做错了什么?

【问题讨论】:

    标签: c++ plugins clang llvm


    【解决方案1】:

    你需要使用 -add-plugin 而不是 -plugin

    【讨论】:

      【解决方案2】:

      我一直认为运行两次clang 是“自然的”,但这是一个有效的问题。

      我不认为你做错了什么,但我相信(没有过多挖掘clang 来源)正在发生的事情是所有Xclang 都被转发到cc1 partclang 创建临时文件以适应插件运行。但是,当链接器作为单独的进程被调用时,这些文件不再存在,因此出现错误。
      您可以通过在所有这些命令上使用 -v 选项来查看所有内容。

      我不确定这是否可能,但这个 SO thread 可能会提供正确方向的线索。

      【讨论】:

      • “此 SO 线程”的链接已损坏。你还有机会吗?
      • @mrks 链接已修复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      相关资源
      最近更新 更多