我已经克隆了 llvm-project 存储库。
然后我为项目生成了一个 Visual Studio 解决方案,使用
cmake -G "Visual Studio 16" -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS=ON -DLLVM_TARGETS_TO_BUILD=X86 -DCLANG_BUILD_EXAMPLES=ON -DCMAKE_INSTALL_PREFIX=install ...\llvm-project\llvm
DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS
正如这里所建议的,重要的部分是。
生成解决方案和所有项目。然后我构建 Clang 本身和 llvm-project 源中已经提供的示例 clang 插件。PrintFunctionNames 似乎是 Clang 插件的 hello world,所以我根据llvm 文档构建了它。
构建成功运行,现在我在安装目录中有 llvm/clang,带有 PrintFunctionNames 插件。
有两种方法可以告诉 clang 使用插件:
clang -cc1 -load PrintFunctionNames.dll -plugin print-fns test.cpp
clang++ -c -Xclang -load -Xclang PrintFunctionNames.dll -Xclang -plugin -Xclang print-fns test.cpp
第一个有效,但是,第二个无效。此外,使用带有第一个命令行参数的 clang++ 也不起作用。这两个命令都适用于 clang,但不适用于 clang++,因此看起来 clang++ 存在问题。此外,省略 -c 命令并实际构建带有激活插件的可执行文件会产生链接错误 (1137)。
似乎 clang++ 不适用于 dll 插件,这很奇怪,因为 clang++ 似乎是同一个 clang 驱动程序,除了用于与 c++ 库链接的不同预设。
我遇到的另一个问题是,在构建树外时,cmake install 命令无法将库文件clang.lib 复制到安装目录,否则无法构建树外插件。手动设置此库的路径(位于原始输出目录中,而不是 cmake install 将移动其他构建输出的位置)似乎允许正确构建树外插件。
但是问题仍然存在:您不能在 Windows 上使用 Xclang 插件加载器或带有插件的 clang++ 驱动程序。不是使用提供的示例插件,也不是使用由树制成的测试插件。
问题是:我是在构建 clang 还是插件错误?如果是这样,为什么-cc1 -load
可以使用带有clang.exe的插件?如何构建提供的示例插件并使其与 clang++ 驱动程序一起使用?我查看了这个实现基本树外插件的GitHub 存储库,但它没有提供有关在 Windows 上构建的任何信息。