我正在尝试交叉编译一个自定义内核模块(从这个 git(, 这取决于最初在 git 中编译的插件(它在 $git/buildtools/gcc-nexmon-plugin/nexmon.c 中(。
最初,这棵树打算直接在树莓派上构建,但我想将这个功能移植到 buildroot 系统上,也就是说,我的树莓派上没有 gcc/g++,我只在我的笔记本电脑上交叉编译。
我的问题是如何正确创建 nexmon.so(插件文件(,以便以后可以在交叉编译时使用它
生成 nexmon.so 的原始命令行是:
g++ -std=c++11 -Wall -fno-rtti -fPIC -I../gcc-arm-noneabi[...]/plugin/include
-c -o nexmon.o nexmon.c
g++ -shared -o nexmon.so nexmon.o
如您所见,它们在树中包含一些交叉编译器("../gcc-arm.."(。
现在我明白了该插件不应该交叉编译。请记住,他们希望我们在树莓派上运行它,所以"g++"是嵌入式的"g++"。在我这边,我必须运行笔记本电脑的"g++"。
不幸的是,我似乎无法让它在我的笔记本电脑上工作,这就是我现在正在尝试的:
g++ -std=c++11 -Wall -fno-rtti -fPIC -I/usr/include
-I/usr/lib/gcc/x86_64-linux-gnu/8/plugin/include -o nexmon.o -c nexmon.c
因为我目前正在使用 g++ 8.3.0-6,并且我找到了相应的插件开发标头。如果我运行这个,我会遇到一堆问题,
- "在包含的插件/include/tree.h 文件中:#error 未知BITS_PER_UNIT">
- "在包含的插件/include/cpplib.h 文件中:#error 找不到至少 32 位有符号整数类型">
这让我觉得我缺少一些标志来正确定义我的笔记本电脑架构- 但我可能是错的。
这是我错误的完整粘贴箱:输出日志
我想我确实有东西来构建插件,因为 gcc8/plugin/include 存在。我尝试安装"gcc-multilib,gcc-8-plugin-dev-i686-linux-gnu,gcc-8-plugin-dev-x86-64-linux-gnux32,gcc-8-plugin-dev"。我无法回到以前的 gcc(如 4.8、5、6、7(,因为我所有的 debian 升级都删除了它们,它们不再使用
任何帮助将不胜感激,到目前为止没有人能够帮助我,我的想法也用完了。这一点完全阻碍了我的项目。
我正在回答我自己的问题,因为这可能对未来的人们有所帮助
首先,我在如何编译一个插件以供以后在交叉编译上下文中使用时错了,正确的方法是:
$(HOST_CXX) -fPIC -I$(TARGET_CC)/[..]/plugin/include -shared
-o plugin.so plugin.c
因此,您不是在交叉编译,而是在调用交叉编译器的插件开发环境。要找出正确的包含路径,只需执行以下操作:
$(TARGET_CXX) -print-file=plugin
我的编译问题是由于这个插件是为较旧的 gcc 版本 (5+( 构建的,而我使用的是 (8+(。我的解决方法是替换以下行:
#include <plugin.h>
(我认为,这是调用插件开发环境的旧方法(,通过以下方式:
#include <gcc-plugin.h>