gpt4 book ai didi

c++ - 从动态库调用 fprintf (c++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:38 25 4
gpt4 key购买 nike

我正在创建一个包含日志类的 Windows DLL 库,该类中的日志函数只是像这样调用 fprintf 以进行测试:

fprintf(stderr, "DEBUG: %s\n", "Hello");

现在,如果我从我的其他项目(使用该库)的任何文件中的任何函数中使用它,这个调用就可以正常工作,但如果我将它放在我的库中任何带有日志记录类的地方,它就不会打印任何东西。
我可以看到它正确运行该功能(使用简单的 exit(0); 进行测试)。

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

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

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

最佳答案

我会避免对任何生产代码执行此操作(尽管测试没问题)。标准 I/O 流属于应用程序,the DLLs are guests in the house .如果您想提供调试输出,请允许应用程序设置用于日志记录的回调函数,例如:

// 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 的意思。当它们不同时,就会发生不好的事情。

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

关于c++ - 从动态库调用 fprintf (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com