Snow Leopard Xcode中的C ++ Debug构建已经破裂

时间:2009-09-12 20:44:10

标签: c++ xcode macos gcc

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

我已将其缩小为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;
}

stringstream插入应该有效,但是当使用GCC 4.2和_GLIBCXX_DEBUG时,'&lt;&lt;&lt;运算符抛出异常,并设置坏位和失败位。

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

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

  1. 按照建议删除标记。这没关系,但这些标志有时非常有用,你不想从项目中删除它们并在修复bug之后再返回并更新它们!

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

  3. 我选择了#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;
    }
    

答案 2 :(得分:0)

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

我真的很想找到解决这个问题,我正在使用XP VirtualMachine和Studio 2005来避免这个问题!