C++ 从动态库(c+;+;)调用fprintf

C++ 从动态库(c+;+;)调用fprintf,c++,C++,我正在创建一个包含日志类的windows DLL库,该类中的log函数仅调用fprintf,如下所示,用于测试: fprintf(stderr,“调试:%s\n”,“你好”) 现在,如果我在其他项目(使用库)的任何文件中的任何函数中使用它,那么这个调用都可以正常工作,但是如果我使用日志类将它放在库中的任何位置,它就不会打印任何内容。 我可以看到它正确地运行函数(使用一个简单的出口(0);进行测试) 现在我对c/c++中的整个库概念还是有点陌生,所以可能有一些东西我不明白,但除此之外我不知道为什么

我正在创建一个包含日志类的windows DLL库,该类中的log函数仅调用fprintf,如下所示,用于测试:

fprintf(stderr,“调试:%s\n”,“你好”)

现在,如果我在其他项目(使用库)的任何文件中的任何函数中使用它,那么这个调用都可以正常工作,但是如果我使用日志类将它放在库中的任何位置,它就不会打印任何内容。
我可以看到它正确地运行函数(使用一个简单的出口(0);进行测试)

现在我对c/c++中的整个库概念还是有点陌生,所以可能有一些东西我不明白,但除此之外我不知道为什么它不起作用

我尝试在这里和谷歌上搜索,但我找不到其他人有同样的问题。
我使用VC++2010


编辑:我想到了传递filepointer,而不是仅仅使用库中的stderr,这会导致抛出异常(抛出时文件的_tmpfname指针为NULL,我不确定是否正确)

我会避免对任何生产代码执行此操作(不过测试也可以)。标准I/O流属于应用程序,并且。如果要提供调试输出,请允许应用程序设置用于日志记录的回调函数,例如:

// In your DLL's header file:
typedef void (*LogFunc)(const char *, ...);
void DLLEXPORT SetLogFunction(LogFunc logFunc);

// In your DLL's source file:
LogFunc g_LogFunc;
void DLLEXPORT SetLogFunction(LogFunc logFunc)
{
    g_LogFunc = logFunc;
}

...
// Then, instead of calling fprintf(stderr, "blah"), do this:
g_LogFunc("blah");
如果您只是为了测试而这样做,那么您可以直接写入stderr,但是请记住,DLL和应用程序必须针对相同版本的C运行时进行链接,才能正常工作。C运行时本身就是一个DLL,如果您的DLL和应用程序指定了C运行时的不同版本,那么您最终会将C运行时的两个单独副本加载到内存中,每个副本都有自己的
stderr
含义。当它们不同时,坏事就会发生


在VisualStudio中,要设置正在使用的C运行时库,请打开项目设置并转到配置属性→ C/C++→ 代码生成→ 运行时库并确保DLL和应用程序都设置为完全相同的值(通常为“多线程DLL(/MD)”或“多线程调试DLL(/MDd)”,具体取决于您是构建调试版本还是发布版本).

您的DLL和主应用程序是否都链接到同一个C运行时版本?我在哪里可以找到这些信息?查看依赖项标记下的“项目”清单,我得到了版本9.0.21022.8,但库的清单不会生成依赖项标记或在其他地方显示C运行时版本:(是的,我会避免在生产代码中从DLL中以任何方式使用
stderr
,在这种情况下,我会始终使用回调。这样,与
stderr
的所有交互都是从主应用程序进行的,并且不可能有多个冲突的C运行时导致此问题。很抱歉随机删除注释。),我在发布xD后意识到了你的意思,非常感谢你的帮助:)