__declspec(dllimport) вызывает сбой компилятора в MSVC 2010
В файле *.cpp пытается использовать стороннюю библиотеку lib:
#define DLL_IMPORT
#include <thirdParty.h>
// Third party header has code like:
// #ifdef DLL_IMPORT
// #define DLL_DECL __declspec(dllimport)
// fatal error C1001: An internal error has occurred in the compiler.
Альтернатива:
#define NO_DLL
#include <thirdParty.h>
// Third party header has code like:
// #elif defined(NO_DLL)
// #define DLL_DECL
// Compiles fine, but linker errors as can't find DLL functions
Я могу воспроизвести результаты, удалив все вместе макросы и #define и вручную отредактировав сторонние файлы, чтобы иметь __declspec(dllimport) или нет - так что материал препроцессора выше просто показывает, что происходит, это не копирование-вставка.
Кто-нибудь сталкивался с чем-либо подобным или может намекнуть на причину? (который создается с помощью CMake). Выше приведен пример сбоя 2 строки *.cpp, поэтому он сужается до чего-то в #include.
Следующие также работают нормально:
- Скомпилируйте примеры, предоставленные третьей стороной (они предоставляют *.sln), которые используют dllimport / export, чтобы это не было ошибкой библиотеки
- Скомпилируйте стороннюю библиотеку как часть производственного проекта (чтобы dllexport работал нормально)
Я просмотрел страницы настроек двух проектов, чтобы попытаться найти различия, но они оказались пустыми. Конечно, возможно, я что-то упускаю, так как эти страницы настроек не самые простые в навигации. Я получу доступ к VS2008 через день или около того, так что можете сравнить с этим. Сторонняя библиотека - MySql++.
2 ответа
Сбой компилятора, безусловно, является ошибкой в компиляторе, поэтому лучше отправлять отчет об ошибках в команду Microsoft Visual C++.
Что касается ошибки
#define DLL_DECL __declspec(dllimport)
это неправильный способ идти о вещах. Должны быть некоторые настройки проекта, которые вы должны установить, директива предварительной обработки, которую вы можете определить вместо DLL_DECL
или просто включив другой файл.
Оказывается, это произошло потому, что предварительно скомпилированные заголовки были включены для проекта, пытающегося использовать DLL.