非独立的C动态库(包括),有多少可能?

时间:2014-03-27 12:30:37

标签: c plugins include fpic

我正在使用一种API编写一个C格斗游戏,允许添加插件(共享库)。每个插件都是一种可以玩游戏的人工智能。在比赛期间可以对每个结束帧做出决定。我的插件有这种结构:

#include "acquisition.h"

void decision_frame(Decision_frame* d){

void* me = tell_me_who_i_am("my_plugin.so");

if (some_information_about(me) == foo){
    d->turn_left = 12;
  }
  /* bla bla bla */
}

所以,我意识到我正在尝试用非面向对象语言实现一些对象,因此," void * me"是一个标识调用者的变量。标题获取看起来像:

#ifndef _GUARD_
#define _GUARD_

typedef struct{
  int move;
  double angle_move;
  double angle_gun;
  double angle_radar;
  int shot;
}Decision_frame;

void* tell_me_how_i_am(char* plug_name);

Bar some_information_about(void* me);
Foo other_information_about(void* me);

#endif

我的acquisition.c(一种API部分......)文件目前包含:

Space* get_space(void){
  static Space S;
  printf("Space adress (by getter) : %p\n", &S);
  return &S;
}

最后,我主要做到了:

1 - >空间初始化(使用getter)在main中设置一个指向Space的局部变量。 (POINT ONE) 2 - >在我的struct Space字段中做一些分配内存。 3 - >在插件bar.so(POINT TWO)之后回想起吸气剂。(点二)

因此我有些肮脏的冗长:

Space address (by getter) : 0x6071c0 (POINT ONE)
Space address in main : 0x6071c0
Auto-loading of plugins...
2 potential plugins founds : 
- alea_all.so... loading OK
- full_dummy.so... loading OK
Space address (by getter) : 0x7ff4e6c650a0 (POINT TWO)
Space address in main : 0x6071c0

我想混合位置无关代码和非位置无关代码是坏的!!!!!!!我处理编译如下:

bin/acquisition.o: src/acquisition.c includes/acquisition.h
      $(GCC) -fpic -c src/acquisition.c -o bin/acquisition.o $(CFLAGS)

plugins/full_dummy.so: plugins/full_dummy.c bin/acquisition.o
      $(GCC) -c -fPIC plugins/full_dummy.c -o plugins/full_dummy.o $(CFLAGS)
      $(GCC) -shared -o plugins/full_dummy.so plugins/full_dummy.o bin/acquisition.o $(CFLAGS)

我不知道:非典型代码可以依赖多少-fpic代码(因为很多非fpic模块使用来自acquire.c的静态变量)?在这种模式中可以使用多少静态变量?

在Pure C中设计这种问题是否存在一种琐碎,安全且好的方法?我的意思是,在同一个程序中插入一些AI ......

对不起我的英语和长篇...

0 个答案:

没有答案