проблемы с портированием библиотеки класса C++ DLL к Visual Studio

Я записал библиотеку классов в C++ и успешно скомпилировал его в Linux с g ++ как общий объект, затем создал несколько приложений, которые используют его. Теперь я должен портировать его на VS2008. Я дал всем классам необходимое __ declspec (dllexport) префиксы, затем попытался скомпилировать его. Я получаю груду предупреждений, которые в основном имеют отношение:

  1. мои пользовательские классы исключений, полученные из станд.:: runtime_error, которые уступают: "предупреждение C4275: не dll-соединяют-интерфейсом с классом 'станд.:: runtime_error', используемый в качестве основы для dll-интерфейсного класса 'cci:: FileOperationException'". Как я, как предполагается, делаю стандартный класс библиотеки dll-экспортным?
  2. спецификации исключения в объявлениях функций членства, которые вызывают "предупреждение C4290: спецификация Исключения C++, проигнорированная кроме указать на функцию, не __ declspec (nothrow)". Я читал где-нибудь, что VS не поддерживает их, и что он делает где-то в другом месте. Как очень сбивающий с толку.

Я считал людей, говорящих, что экспорт классов в DLL обычно является Плохой Идеей, что существует несметное число вещей, которые могут пойти не так, как надо, и теперь у меня есть голова, полная понятий как двоичная несовместимость, dll черт, несоответствия версии компилятора и т.д., и быть честным я не могу действительно понять его. Каков корректный, безопасный и простой способ создать общую библиотеку классов в Windows, затем?

Спасибо.

6
задан Joel Coehoorn 6 January 2010 в 18:18
поделиться

2 ответа

[

] Я поддерживаю [] библиотеку классов C++[], которая обычно используется как DLL в Windows, так что это можно сделать. Относительно ваших проблем:[

] [
    ] [
  1. ][

    ]Этого не происходит в моей библиотеке. Возможно, Вам необходимо использовать опции сборки /MD и /MDd? Таким образом, ваша библиотека исполнения на C++ тоже идет из DLL, чем и славится VC++.[

    ][
  2. ] [
  3. ][

    ]Не используйте throww-specs. [] Они злые []. Если вы чувствуете, что все равно должны это сделать, просто поместите что-то подобное в заголовочный файл, который включает каждый модуль, прежде чем он попадет в код, использующий throww-specs.[

    ][
  4. ] [
] [
] [

]#pragma warning(disable: 4290)[

] [
]
1
ответ дан 17 December 2019 в 22:13
поделиться
[

] Сначала вы должны спросить себя, действительно ли вам нужна динамическая библиотека здесь. Статические библиотеки или даже лучше включить исходный код непосредственно в ваш проект - это хорошее решение, которое приходит без этих проблем. [

] [

] Если вам действительно нужна DLL, то как я бы это сделал (учитывая много времени), так это обернул бы ваш класс в C-интерфейс. Затем вы можете воссоздать ваш старый интерфейс C++ как библиотеку только заголовков C++, которая взаимодействует только с вызовами C, экспортированными из DLL. Бонусной особенностью такого подхода является то, что будет тривиально использовать вашу библиотеку практически из любого языка программирования, так как импорт функций C из DLL высоко поддерживается.[

] [

]Другим способом будет использование COM, но так как вы портируете из Linux, это, вероятно, не вариант.[

].
0
ответ дан 17 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

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