好吧,我试着编译一个我正在研究的小测试应用程序。
所以要简单明了:
当我将代码生成从“Multi Threaded DLL”设置为“Multi Threaded”以摆脱一些依赖时,以下代码行崩溃了我的应用程序(它通常运行时没有任何缺陷)
当我想将短路径转换为长路径时,会发生崩溃。就这样:
LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp"));
GetLongPathNameA(tmp,tempFolder,MAX_PATH);
崩溃特别发生在第一行:
LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp"));
所以任何想法都可以解释为什么当你切换代码生成模式时它会突然停止工作?谢谢!
编辑:
经过一些代码重写后,我设法在执行
时发现它特意崩溃getenv("Temp");
非常非常奇怪,因为它在其他模式下工作
答案 0 :(得分:1)
确保所有项目(以及这些项目的所有文件)始终设置为编译并链接到相同版本的运行时库(即多线程静态)。如果混合使用这些选项,编译和链接的程序将具有未定义的行为。还要确保您编译和链接正确版本的外部库(MFC等)。在某些情况下,您只能使用某些版本的运行时,例如如果你与.Net进行互操作,你必须使用多头dll版本。
答案 1 :(得分:1)
您应该在访问之前检查getenv()的返回值:
LPCSTR tmp = getenv("Temp");
if(tmp != NULL)
// do something with tmp
我的猜测是你的程序无法读取环境变量,访问生成的NULL指针会导致程序崩溃。
Microsoft建议使用getenv_s(),这里是他们的MSDN示例,稍作修改,适合您的工作:
char *tmp;
size_t requiredSize;
getenv_s(&requiredSize, NULL, 0, "Temp");
tmp = (char *) malloc(requiredSize * sizeof(char));
if (tmp != NULL)
{
getenv_s(&requiredSize, tmp, requiredSize, "Temp");
if(tmp != NULL)
// do something with tmp
free(tmp);
}
我个人建议切换到WinAPI函数GetEnvironmentVariable(),这将为您提供更详细的错误消息(如果函数失败,请使用GetLastError())这可能会帮助您找到问题的根源(或修复通过使用其中一种替代方案)。
答案 2 :(得分:0)
尝试重建项目。清理它,确保输出文件夹中没有任何内容,为了好的措施删除.ncb,然后构建。
答案 3 :(得分:0)
从动态运行时切换到静态后,您是否已将libcmt.lib
和libcpmt.lib
指定为链接器设置中的依赖项?如果没有,请试试。然后进行重建。
答案 4 :(得分:0)
您不应该使用reinterpret_cast,因为它适用于由其他类继承或继承的对象。只需将static_cast用于基本类型或指向基本类型的指针。