Независимая динамическая библиотека C (включая), насколько это возможно?

Я программирую файтинг на C с помощью своего рода API для добавления плагинов (общая библиотека). Каждый плагин — это своего рода искусственный интеллект, который может играть в игру. Решение может быть принято в каждом конечном кадре игры. Мои плагины имеют такую ​​структуру:

#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 -> Инициализация пространства (использование геттера), чтобы установить локальную переменную в main, указывающую на пространство. (ПУНКТ ПЕРВЫЙ) 2 -> Выделить память внутри поля моей структуры Space. 3 -> отзыв геттера после кучи dlopen над плагинами bar.so (ПУНКТ ВТОРОЙ)

Таким образом, у меня есть какой-то мусорный многословный:

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-кода (поскольку многие не-fpic-модули используют статические переменные из Acquisition.c)? Сколько статических переменных можно использовать в таком шаблоне?

И есть ли тривиальный, безопасный и приятный способ решения такой задачи в Pure C? Я имею в виду, добавить немного ИИ в ту же программу...

Извините за мой английский и за длинное...


person user3005788    schedule 27.03.2014    source источник
comment
Пожалуйста, просто задавайте по одному вопросу за раз, это слишком широко для SO.   -  person Jens Gustedt    schedule 27.03.2014
comment
Прошу прощения два раза: во-первых, ваш комментарий верен, вопрос плохо сформулирован и мне все еще трудно указать реальную суть моей проблемы, во-вторых, ответ относительно дан в ответе на вопрос Глобальные переменные, общие библиотеки и эффект -fPIC и ссылка внутри ответ. Я не знаю, как пометить этот вопрос как недействительный или двойной...   -  person user3005788    schedule 27.03.2014