1

我必须扩展一个控制单个无人机(鹦鹉 AR Drone)的 C 程序。目标是控制一个无人机中队,但 API 使用了大量的全局变量(无人机 IP、端口、无人机状态……)。如何在实例之间不发生“冲突”的情况下多次实例化库?

我找到的唯一解决方案是修改 API(它是开源的)以在 main() 函数的某处调用 fork(),我想避免这种情况......

4

3 回答 3

1

我建议只将库包装在服务过程中。然后,您可以为每架无人机运行一个服务流程实例。否则,修复库以获取上下文参数。

于 2012-02-06T11:02:48.427 回答
1

dlmopen可以多次加载一个库。但仅限于 15 次。
您还可以创建库的多个副本并加载每个副本。

于 2012-02-06T11:03:32.510 回答
0

使用宏来替换所有全局变量,如下所示:

#define global1 ctx->global1
#define global2 ctx->global2
...

然后struct context *ctx为每个函数添加一个参数。

或者,将_Thread_local(或__thread使用旧版本的 gcc)添加到每个全局变量,然后在其自己的线程中运行每个“实例”,这样它自然就有自己的全局变量副本可供使用。

于 2012-02-06T14:40:40.723 回答