【问题标题】:__declspec(dllimport) causes compiler crash on MSVC 2010__declspec(dllimport) 导致 MSVC 2010 上的编译器崩溃
【发布时间】:2012-09-06 08:22:03
【问题描述】:

在 *.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. 编译使用 dllimport/export 的第三方提供的示例(他们提供了 *.sln),因此这似乎不是库的错
  2. 将第三方库编译为生产项目的一部分(因此 dllexport 工作正常)

我浏览了这两个项目的项目设置页面以尝试找出差异,但结果一片空白。当然,我可能遗漏了一些东西,因为这些设置页面不是最容易导航的。我将在一天左右的时间内访问 VS2008,因此可以与之比较。第三方库是MySql++。

【问题讨论】:

  • 您的意思是链接器崩溃,或者链接器报告错误 LNKxxxx ?

标签: c++ visual-c++ declspec


【解决方案1】:

原来是因为尝试使用 DLL 的项目打开了预编译头文件。

【讨论】:

    【解决方案2】:

    编译器崩溃肯定是编译器中的错误,因此您最好向 Microsoft Visual C++ 团队提交错误报告。

    至于错误

    #define DLL_DECL __declspec(dllimport)
    

    做事的方式是错误的。应该有一些你需要设置的项目设置,一个你可以定义的预处理指令,如果DLL_DECL,或者只是包含一个不同的文件。

    【讨论】:

    • 我受第三方约束,但你是对的 - 我设置了一个宏,它导致 #define DLL_DECL 成为包含文件的第一行。为了清楚起见,我在示例中将其取出 - 实际上有大量设置,但我可以在第三方标题中手动键入 __declspec 部分来重现结果,所以我非常有信心这是根本问题。
    • @Zero 只会让人感到困惑。那是你应该使用的宏,DLL_DECL 似乎是库的内部,你不应该改变它。
    • 公平点 - 为了清楚起见,我进行了编辑,希望现在更好。
    • @Zero 你有lib 文件可以链接吗?
    • MySql++ 似乎还有另一个问题,即静态链接时从 std::ostream 继承会导致链接器错误。我正在单独讨论这个问题。感谢您的帮助。
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多