今天遇到一个奇怪的问题。
开发环境:
1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库
2. Visual Studio 2008
问题描述:
在 eclipse cdt 中用 gcc 编译了一个 dll,这个 dll 中有一个接收收 FILE* 参数的函数
void thefunc(FILE* f) { fprintf(f, "Hello World!\n"); }
编译成 dll 后,在 MSVC 下使用这个 dll 中的 thefunc 函数,编译能通过,但运行时就会出现内存不能为 written 的错误。
以下三种调用均是同样的问题:
1.
#include<stdio.h> int main() { thefunc(stdout); }
2.
#include<stdio.h> int main() { thefunc(stderr); }
3.
#include<stdio.h> int main() { FILE* f = fopen("d:\\f.txt", "wb"); thefunc(stdout); fclose(f); }
经过反复尝试,发现:
1. dll 和 调用程序都用 gcc 编译,可以正常运行
2. dll 和 调用程序都用 vs2008 编译,也可以正常运行
3. dll 用 gcc 编译,调用程序用 vs2008 编译,编译能通过,但运行是会出现内存为 written 的问题。
4. 目前发现,使用 gcc 这样编译出来的 dll 中的其他大部分函数都可以在 vs2008 中正常使用,但涉及到这个 FILE* 类型的参数时,就会有问题。
疑问:
测试程序已经非常简化,可以排除是代码逻辑上的问题,但为何会出现这种 gcc 编译出来的 dll,在 vs2008 下大部分函数可以正常使用,但使用 FILE* 类型的参数就会出现问题呢,这是什么原因?有没有解决办法?求路过的大虾指点。