__declspec (dllimport) вызывает сбой компилятора в MSVC 2010

В файле * .cpp пытается использовать стороннюю библиотеку:

#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.

Следующие также работают нормально:

  1. Скомпилируйте примеры, предоставленные третьей стороной (они предоставляют * .sln), которые используют dllimport / export, чтобы это не было ошибкой библиотеки
  2. Скомпилируйте стороннюю библиотеку как часть производственного проекта (чтобы dllexport работал нормально)

Я просмотрел страницы настроек двух проектов, чтобы попытаться найти различия, но они оказались пустыми. Конечно, возможно, я что-то упускаю, так как эти страницы настроек не самые простые в навигации. Я получу доступ к VS2008 через день или около того, так что можете сравнить с этим. Сторонняя библиотека — MySql ++.

0

Решение

Сбой компилятора определенно является ошибкой в ​​компиляторе, поэтому лучше всего отправлять отчет об ошибках в команду Microsoft Visual C ++.

Что касается ошибки

#define DLL_DECL __declspec(dllimport)

это неправильный способ идти о вещах. Должны быть некоторые настройки проекта, которые вы должны установить, директива предварительной обработки, которую вы можете определить вместо DLL_DECLили просто включив другой файл.

1

Другие решения

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

0

По вопросам рекламы [email protected]