7

所以在网上搜索了一段时间后,我决定在这里尝试一下,因为它似乎是一个很好的讨论论坛。我试图创建一个简单的 gcc 插件。程序代码附在这封邮件的末尾,但用简单的英语它注册插件并确保在注册 pragma 时调用 pragma_init 函数。正是在这里,我使用 c_register_pragma 来截取一些 pragma。

我使用http://gcc.gnu.org/onlinedocs/gccint/Plugins-building.html#Plugins-building中的示例对其进行编译。编译和链接工作正常。但是,当我加载插件时,我得到:

gcc -c -fplugin=plugin.so   test.c -o test.o 

cc1: error: cannot load plugin plugin.so

plugin.so: undefined symbol: warning

我究竟做错了什么?此外,当包含一些头文件(稍后将需要)时,我得到了很多错误。例如,包括“tree.h”会产生(在 50 个其他错误中):

/machmode.h:262:1: error: unknown type name 'class'

 class bit_field_mode_iterator
 ^
/machmode.h:263:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

 {
 ^
/plugin/include/tree.h:27:0,
             from conftest.c:63:

/vec.h:220:8: error: field 'register_overhead' declared as a function

有人知道我做错了什么吗?

谢谢

4

2 回答 2

3

这里有两个问题:

错误:“无法加载插件 plugin.so”意味着您应该将存储新共享库插件的目录添加到 LD_LIBRARY_PATH。

如果您使用 g++ 而不是 gcc 进行编译,那么包含中所有文件的数百个错误都会在我的计算机中得到解决(不确定为什么会这样想)

于 2014-05-26T12:18:18.813 回答
2

您使用哪个版本的 GCC 来编译您的插件和使用该插件?运行简单

 gcc -v

无需任何其他程序参数即可找出!

您是否为 GCC 插件开发安装了适当的软件包(在 Debian 或 Ubuntu 上,可能是gcc-4.7-plugin-dev,但4.7要根据您的特定 GCC 版本调整版本)?

您是否安装了构建 GCC 所需的所有依赖项(在 Debian 或 Ubuntu 上apt-get build-dep gcc-4.7 gcc-4.7-plugin-dev)?

最新版本的 GCC(尤其是发行版提供的许多 GCC 4.7,以及所有 GCC 4.8)都是由 C++ 编译器编译的,而不是 C 编译器。

您可以通过运行检查您的GCC是如何构建的(在 C 或 C++ 中)

nm -D -C $(gcc -print-file-name=cc1) 

如果该命令显示键入的 C++ 管理名称,例如,execute_ipa_pass_list(opt_pass*)而不只是execute_ipa_pass_list您的 GCC 已使用 C++ 编译器编译(可能g++

所以你可能需要使用g++(not gcc) 来编译你的 GCC 插件。

正如我所评论的,您是否考虑过使用MELT(一种扩展 GCC 的领域特定语言)来扩展或自定义您的gcc编译器?

我建议下载最新的http://gcc-melt.org/melt-plugin-snapshot.tar.bz2,因为我将在几周内为 GCC 4.7 和 4.8 发布下一个 MELT

并且不要期望使用插件来改变 GCC 的解析行为。这是不可能的(GCC 仅提供插件挂钩来添加您的内置函数和编译指示,而不是扩展解析的语法)。

于 2013-04-11T12:13:32.720 回答