проблемы с переносом библиотеки классов DLL C ++ в Visual Studio - PullRequest
6 голосов
/ 06 января 2010

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

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

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 06 января 2010

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

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

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

# Прагма предупреждение (отключить: 4290)

1 голос
/ 06 января 2010

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

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

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

...