【问题标题】:Fatal error when using FILE* in Windows from DLL从 DLL 在 Windows 中使用 FILE* 时出现致命错误
【发布时间】:2010-05-07 13:11:32
【问题描述】:

最近,我发现 Visual C++ 2008 编译器存在问题,但使用小技巧可以避免它。目前,我不能使用相同的 hack,但 2008 年和 2010 年一样存在问题(Express)。

所以,我为你准备了 2 个简单的 C 文件:一个用于 DLL,一个用于程序:

DLL(文件-dll.c):

#include <stdio.h>

__declspec(dllexport) void
print_to_stream (FILE *stream)
{
  fprintf (stream, "OK!\n");
}

对于通过 file-dll.lib 链接此 DLL 的程序:

程序:

#include <stdio.h>

__declspec(dllimport) void print_to_stream (FILE *stream);

int
main (void)
{
  print_to_stream (stdout);
  return 0;
}

编译和链接DLL:

cl /LD file-dll.c

编译和链接程序:

cl file-test.c file-dll.lib

在调用 file-test.exe 时,我遇到了致命错误(类似于 UNIX 中的分段错误)。

正如我之前所说,我之前也遇到过同样的问题:关于将 FILE* 指针传输到 DLL。我想,这可能是因为编译器不匹配,但现在我对所有事情都使用一个编译器,这不是问题。 ;-(

我现在能做什么?

UPD: 我找到了解决方案:

cl /LD /MD file-dll.c
cl /MD file-test.c file-dll.lib

关键是链接到动态库,但是(我不知道)默认情况下它会静态链接并且(因此)发生错误(我明白为什么)。

附:感谢您的耐心。

【问题讨论】:

    标签: c file dll pointers


    【解决方案1】:

    Potential Errors Passing CRT Objects Across DLL Boundaries

    这里有一个针对您的情况的具体示例。根据您编译 DLL 和程序的方式,您可能拥有单独的 CRT 副本,这将导致访问冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多