DLL и полностью специализированный шаблонный класс

Среда: Visual Studio 9, C++ без управляемых расширений.

У меня есть сторонняя библиотека, которая экспортирует полностью специализированный шаблонный класс MyClass<42> определенный в MyClass.h. Это компилируется в загрузчик помощника .lib и .dll файл. .lib файл содержит скомпилированный код для этой специализации и необходимые символы. MyClass.h похож на это:

template<UInt D>
class MyClass {
public:
    MyClass() {...};
    virtual ~MyClass() {};
}

Теперь я хотел бы пользоваться этой библиотекой. Если я буду включать MyClass.h в Client.cpp и затем буду компилировать его, то я получу вторую копию этих символов в файле Client.obj. Я могу избавиться от этих символов путем определения всего члена той специализации как "экстерн". Мой Client.cpp похож на это:

#include <ThirdParty/MyClass.h>

extern template class MyClass<42>;
extern template MyClass<42>::MyClass<42>();
extern template MyClass<42>::~MyClass<42>();

void MyFunction(MyClass<42>& obj) {...}

Проблема состоит в том, что я не могу избавиться от виртуального деструктора этот путь. Для виртуального деструктора я получаю почти стандартную ошибку LNK2005:

ThirdPartyd.lib(ThirdPartyd.dll) : error LNK2005:
    "public: virtual __thiscall MyClass<42>::~MyClass<42>(void)"
    (??1?$MyClass@$01@@@UAE@XZ) already defined in Client.obj

Что мне делать?

8
задан liori 17 February 2010 в 23:19
поделиться

2 ответа

Похоже, что для виртуальных методов необходимо определить их как extern и __ declspec (dllimport) в то же время:

extern template __declspec(dllimport) MyClass<42>::~MyClass<42>();

Это сделало мой компоновщик достаточно счастливым, чтобы правильно связать мой код.

Я был бы очень рад, если бы какой-нибудь эксперт объяснил, почему так, или хотя бы указал на какую-нибудь статью, объясняющую этот случай.

4
ответ дан 5 December 2019 в 23:15
поделиться

No. многопоточное программирование означает, что у вас есть один процесс, и этот процесс генерирует кучу потоков. Все потоки выполняются одновременно, но все они находятся в одном пространстве процесса: они могут получать доступ к одной и той же памяти, иметь одинаковые открытые файловые дескрипторы и так далее.

Параллельное программирование является немного более «общим» как определение. в MPI вы выполняете параллельное программирование, выполняя один и тот же процесс несколько раз, с той разницей, что каждый процесс получает свой «идентификатор», так что при желании можно дифференцировать каждый процесс, но это не обязательно. Кроме того, эти процессы независимы друг от друга и должны взаимодействовать через каналы или сетевые/unix-разъемы. Библиотеки MPI предоставляют специальные функции для перемещения данных в узлы в синхронном или асинхронном стиле.

В отличие от этого OpenMP обеспечивает параллелизацию с помощью многопоточности и общей памяти. Вы указываете компилятору специальные директивы, и он автоматически выполняет параллельное выполнение для вас.

Преимущество OpenMP в том, что он очень прозрачен. Есть цикл для распараллеливания? просто добавьте пару директив, и компилятор портирует их на части, и назначьте каждый фрагмент цикла другому процессору. К сожалению, для этого нужна архитектура общей памяти. Кластеры с узловой архитектурой не могут использовать OpenMP на уровне кластера. MPI позволяет работать на узловой архитектуре, но приходится платить за более сложное, а не прозрачное использование.

-121--1144201-

Необходимо сравнить textarea.scrollHeight с textarea.scrollTop - чем ближе они, тем ближе вы к концу текстовой области.

-121--4055782-

Я считаю, что Visual Studio использует специализацию шаблона в dll для некоторых stl-конструкций. последовательность приходит в голову,

У меня был быстрый взгляд на файл заголовка, и похоже, что он использует

__declspec(dllimport)

на объявлении множества специализаций. Но не кажется, что это так для всего класса.

Из этого обсуждения звучит так, будто можно объявить весь класс экспортируемым, но не говорит как.

Извините за не совсем полный ответ, но, надеюсь, это поможет вам исследовать другие места встречи.

1
ответ дан 5 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

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