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

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

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

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

2 ответа

Решение

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

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

#define DLL_DECL __declspec(dllimport)

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

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

Другие вопросы по тегам