Связать dll со статической библиотекой и загрузить ее в приложение, связанное с той же статической библиотекой - PullRequest
1 голос
/ 17 декабря 2011

Я создаю приложение, которое поддерживает модули в форме DLL, которые загружаются динамически во время выполнения.Код раскладывается следующим образом:

  • core - статическая библиотека

    У этого есть механизм для загрузки общих библиотек и вызова "функция create, которая возвращает новый объект Module (использует общий заголовок).

  • module общая библиотека (связана с базовой статической библиотекой)

    Этот модуль использует общий заголовок модуля, а также другие классы из базовой библиотеки (следовательно, почему он связан с базовой библиотекой).Он построен для включения всех символов из статических библиотек.

  • тестовое приложение исполняемый файл (связанный с базовой статической библиотекой)

Я получаю фанки и, казалось бы, спорадическое поведение.Они всегда приводят к нарушениям доступа, но кажется, что переменные-члены, которые я очень явно установил (целые числа), будут распечатаны в последующих функциях как мусор (я убедился, что они не удаляются ранее).Кажется, что это происходит только в том случае, если они загружают динамическую библиотеку (даже если я никогда не вызываю функцию create).

Мой главный вопрос: существует ли здесь опасность того, что символы в общей библиотеке будут конфликтовать ссимволы в исполняемом файле (поскольку они пришли из одной и той же статической библиотеки) и вызывают проблемы, даже если они из одной и той же статической библиотеки?

1 Ответ

5 голосов
/ 28 июня 2012

Я не могу говорить о поведении Linux и OS X, но в Windows именно так и происходит.Поскольку вы говорите, что также хотите компилировать в Windows, это актуально.

Проблема, с которой вы сталкиваетесь, заключается в том, что у вас есть несколько версий всего в ядре .Каждый модуль и само приложение имеют свою собственную копию ядра, и их переменные не совместно используются.Это включает в себя среду выполнения C, поэтому такие вещи, как new / delete через границы модуля чреваты опасностью.

Чтобы убедиться, что это именно то, что происходит, создайте простой тест: задайте для глобального значения в ядре значение вваше тестовое приложение, затем из из вашего динамически загруженного кода попробуйте получить доступ к этому глобальному и посмотреть, что вы получите.Держу пари, что вы увидите, что ваш магазин в глобальном масштабе не будет отражен!

Решения:

1) Сделать ядро ​​общей динамической библиотекой.Это может или не может быть вариант для вас.

2) Работать очень осторожно со знанием вышеизложенного;Все CRT и / или ваше собственное состояние ядра не будут совместно использоваться, поэтому вы должны убедиться, что вещи будут размещены / уничтожены на своей стороне границ модуля, среди прочего.

Мое собственное приложение разработано почтиидентично твоему;то есть статическая библиотека с общим кодом, который необходим как приложению, так и модулями, а затем динамически загружаемые плагины, загружаемые ядром приложения.

Что я делаю для всех состояний общего ядра, к которым необходимо обращаться через модули, так это то, чтоПервое, что делает каждый модуль после загрузки, - это «указатель ядра», настроенный на создание экземпляров библиотек ядра в приложении.Это гарантирует, что все модули работают с одинаковыми данными.

...