【问题标题】:C++ Debug builds broke in Snow Leopard XcodeSnow Leopard Xcode 中的 C++ Debug 构建中断
【发布时间】:2010-11-27 19:34:57
【问题描述】:

升级到 Xcode 3.2 和 Snow Leopard 后,我的调试版本在运行时损坏并失败。字符串流似乎不起作用。它们在发布模式下工作。

我已将其范围缩小为 GCC 4.2、OSX SDK 10.6 和 _GLIBCXX_DEBUG 预处理器符号的组合。这些是新 Xcode 项目的调试配置的默认设置。

这段代码说明了问题:

#include <iostream>
#include <string>
#include <sstream>

int main (int argc, char * const argv[]) {

    std::stringstream stream;
    std::cout << "             expected  actual" << std::endl;
    std::cout << "stream.bad:  0         " << stream.bad() << std::endl;
    std::cout << "stream.fail: 0         " << stream.fail() << std::endl;
    std::cout << "stream.eof:  0         " << stream.eof() << std::endl;
    std::cout << "stream.good: 1         " << stream.good() << std::endl;

    stream.exceptions(std::ios::badbit | std::ios::failbit | std::ios::eofbit);
    try{
        stream << 11;       //< Does not work as expected (see output)
    }catch (std::bad_cast &e) {
        std::cout << "Unexpected bad_cast: " << e.what() << std::endl;
    }catch(std::exception &e){
        std::cout << "Unexpected exception: " << e.what() << std::endl;
    }

    std::cout << "             expected  actual" << std::endl;
    std::cout << "stream.bad:  0         " << stream.bad() << std::endl;
    std::cout << "stream.fail: 0         " << stream.fail() << std::endl;
    std::cout << "stream.eof:  0         " << stream.eof() << std::endl;
    std::cout << "stream.good: 1         " << stream.good() << std::endl;
    std::cout << std::endl;
    std::cout << "EXPECT: " << 11 << std::endl;
    std::cout << "ACTUAL: " << stream.str() << std::endl;

    std::cout << std::endl << "Done" << std::endl;
    return 0;
}

字符串流插入应该可以工作,但是当使用 GCC 4.2 和 _GLIBCXX_DEBUG 时,'

我尝试了编译器和 SDK 的各种组合,结果如下: - 在 SDK 10.6 中使用 GCC 4.2、LLVM-GCC 或 CLANG 不起作用。 - 在 SDK 10.5 中使用 GCC 4.2、LLVM-GCC 或 CLANG 确实有效。 - 将 GCC 4.0 与 SDK 10.5 或 10.6 一起使用。

如果 _GLIBCXX_DEBUG 已损坏或不受支持(使用 SDK 10.6 和 GCC 4.2),那么为什么这是新项目中调试配置的默认设置(C++ 命令行)?

【问题讨论】:

    标签: c++ xcode macos gcc


    【解决方案1】:

    gcc 4.2 目前不支持 STL 调试模式。您可以将 gcc 4.0 与 STL 调试模式一起使用,或者从调试配置中删除调试模式预处理器宏并继续使用 gcc 4.2。

    【讨论】:

    • 当然,由于GCC是开源的,你可以随时自己修复。
    • 谢谢,这仅适用于 Apple 的 GCC 吗?它适用于具有此版本的其他平台。如果不支持,那为什么它是 XCode 中的默认设置? Apple 会在任何地方记录这一点吗?
    • @cdespinosa,您是否有任何来源表明不支持 STL 调试模式。另外,我用 OSX Lion 试过了,还是不行。
    【解决方案2】:

    现在这是编译器中的一个已知和报告的错误。唯一的解决方法是:

    1. 按照您的建议删除标志。没关系,但这些标志有时非常有用,您不想将它们从项目中删除,并且在修复错误后返回并再次更新它们!

    2. 在发布模式下执行测试,直到您确实需要调试器符号,然后暂时删除标志。

    我选择了#2,这样当修复出来时,项目不会丢失标志。欲了解更多信息,请参阅:

    Apple Discussions

    顺便说一句,我遇到这个问题的代码就是这么简单:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        string firstName;
        string lastName;
        int age;
        char gender;
    
        cout << "Enter First Name: " << endl;
        cin >> firstName;  // <----- error happens right here
    
        cout << "Enter Last Name: ";
        cin >> lastName;
    
        cout << "Enter age: ";
        cin >> age;
    
        cout << "Enter gender: (m or f) ";
        cin >> gender;
    
        cout << firstName << lastName << age << gender;
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      如果您有很多目标(我遇到过这个问题),请不要忘记配置每个目标,因为 projet 构建配置不会覆盖目标构建配置。

      我真的特使终于发现要解决这个问题,我正在使用 XP VirtualMachine 和 Studio 2005 来避免这个问题!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        相关资源
        最近更新 更多