最近,我发现Visual C ++ 2008编译器存在问题,但使用次要黑客可以避免它。目前,我不能使用相同的黑客,但问题存在于2008年和2010年(快递)。
所以,我已经为你准备了2个简单的C文件:一个用于DLL,一个用于程序:
DLL(file-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
关键是链接到动态库,但是(我不知道)默认情况下它会链接staticaly和(因此)错误发生(我明白为什么)。
P.S。感谢您的耐心等待。
答案 0 :(得分:4)
Potential Errors Passing CRT Objects Across DLL Boundaries
这里有一个具体的例子。根据您编译DLL和程序的方式,您可能拥有CRT的单独副本,这将导致访问冲突。