使用Xenomai创建动态链接库

项目中需要Xenomai创建实时周期的任务,并封装为动态链接库,这里记录下遇到的问题。

按照 QT编译xenomai用户层程序 中的步骤设置,建立好动态库工程之后。

编译,会发生如下错误:

:-1: error: /usr/xenomai/lib/xenomai/bootstrap.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC

提示编译动态库的时候需要加 -fPIC标志,添加如下:

XCFLAGS = $(shell $$XENO_CONFIG  -fPIC --skin=alchemy --cflags)
XLDFLAGS = $(shell $$XENO_CONFIG  -fPIC --skin=alchemy --ldflags)

编译通过,运行动态链接库,又发生下面的错误:

Segmentation fault(core dumped)

发生了堆栈溢出。

幸好在Xenomai论坛中有人碰到同样的问题,

Cannot create a share library linked against Xenomai libs

按照里面的描述,参考官方文档:

XENO-CONFIG(1) Manual Page

--auto-init-solib
This switch enables the auto-initialization feature described above for a shared library target instead of a pure executable. The main difference resides in a position-independent (PIC) glue code being used for bootstrapping the initialization.

在编译参数中添加 --auto-init-solib 标志

XCFLAGS = $(shell $$XENO_CONFIG  --skin=alchemy  --auto-init-solib --cflags)
XLDFLAGS = $(shell $$XENO_CONFIG  --skin=alchemy --auto-init-solib --ldflags)

再次运行,成功!