Принуждение символа экспортирует с MSVC

У меня есть приложение и несколько плагинов в файлах DLL. Плагины используют символы из приложения через библиотеку экспорта. Ссылки на приложение в нескольких статических библиотеках и это - то, куда большинство символов прибывает из. Это хорошо работает, пока приложение использует символ. Если символ не используется там, я получаю ошибки компоновщика при компиляции DLL.

Как я могу вызвать экспорт символов, только используемых в плагинах?

Для инициирования экспорта, я попробовал что-то вроде этого:

    class MyClassExporter
    {
        MyClass mInstance;
    public:
        MyClassExporter() {}
    };
    static MyClassExporter TheMyClassExporter;

в одних из помех освобождает приложение, сделан из вызвать экспорт, который не работал.

В ответ на Greg (благодарит за ответ) и разъясниться: классом, для которого я хочу вызвать экспорт, является MyClass (который имеет __ declspec (...) определенный, в зависимости от того, хочу ли я экспортировать или импортировать). MyClassExport был моей попыткой вызвать включение неиспользованных (с точки зрения приложения) символы в приложение. Я хочу 'коснуться' символов так, чтобы компоновщик распознал их, как используется и включал их в приложение так, чтобы оно могло в свою очередь экспортировать их в мои плагины. Соединение помех освобождает в плагины, не опция, так как они содержат одиночные элементы, которые были бы дублированы (приложение и DLLs, у каждого есть их собственная копия статических переменных).

7
задан torque 15 January 2009 в 18:29
поделиться

3 ответа

Вы, вероятно, хотите посмотреть на __ declspec (экспорт/импорт)

#ifdef DLL_EXPORTING
#define WHDLL __declspec(dllexport)
#else
#define WHDLL __declspec(dllimport)
#endif

При соединении статического модуля в dll, это только введет код, который используется. Я никогда не импортировал материал от статического lib до просто ре, экспортируют его.
, Возможно, просто необходимо отметить его как экспортный в dll при компиляции статического lib.

, Но это напоминает мне о помещении контейнеров станд. в экспортируемые классы и использование некоторого обмана в msvc экспортировать 'экземпляр' специализированного контейнера. шаблон кода подобен Вашему статическому коду (в моих взглядах)

, например, без шаблона, Вы получаете предупреждения, шаблон кода не экспортируется для поддержки класса - это - MSVC, конкретный от моего понимания

template class DLL_EXPORTING std::auto_ptr<wxCursor>;
class DLL_EXPORTING imageButton : public wxWindow
{
    std::auto_ptr<wxCursor> m_Cursor;
};
3
ответ дан 6 December 2019 в 23:14
поделиться

/ ВКЛЮЧАЮТ , директива может использоваться, чтобы вынудить компоновщика MSVC включать символ. С другой стороны /OPT:NOREF может использоваться для отключения удаления неиспользованных символов в целом.

общий подход А должен создать единственную неиспользованную функцию, которую ссылки все объекты экспортировали для Ваших плагинов. Тогда Вам только нужен единственный/, ВКЛЮЧАЮТ директиву для той функции.

3
ответ дан 6 December 2019 в 23:14
поделиться

Что я испытал для решения, это было этим:

  1. создают статическую библиотеку с функцией void afunction( int ).
  2. создают dll, связанный со статическим lib, экспортируя afunction.
  3. создают exe, с помощью afunction символ.

, Как? Так как компоновщику можно сказать экспортировать функции с помощью __declspec(dllexport) директива, dll должен не больше, чем объявить экспортируемый будущим образом символ таким образом.

lib имеет заголовок "afunction.h" и сопровождение cpp файл, содержащий тело функции:

// stat/afunction.h
namespace static_lib { void afunction(int); }


// stat/afunction.cpp
#include "afunction.h"
namespace static_lib { void afunction(int){ } }

dll имеет включать файл "indirect.h", содержа объявление функции, которая будет экспортироваться. dll имеет разовую ссылкой зависимость к статическому lib. (Опции компоновщика: Входные Зависимости / Дополнительные Зависимости: "static_library.lib")

// dll/indirect.h
namespace static_lib {
  __declspec( dllexport ) void afunction(int);
}

исполняемый файл имеет только косвенно включенный файл:

#include <dll/indirect.h>
int main() { static_lib::afunction(1); }

И предполагают что? Это компилирует, ссылки и даже работает!

2
ответ дан 6 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: