2009-09-20 13 views
8

Sto utilizzando C++ per sviluppare la parte algoritmica di un'applicazione iPhone e sto riscontrando uno strano bug. Il codice che ho, si integra bene con gcc-4.2 sia su Linux, sul Mac e sul dispositivo iPhone, ma non sul Simulatore, il che rende molto difficile il debugging e il testing.Codice che compila per il dispositivo iPhone ma non per il simulatore

I messaggi di errore dai tentativi di compilazione per il simulatore somigliano a un bug noto in 4.0.x, anche se non è molto chiaro il motivo per cui ho impostato esplicitamente gcc-4.2 per essere il compilatore predefinito.

Per dimostrare il bug, ho preparato il seguente codice piccolo frammento:

bug.cpp

#include <tr1/unordered_map> 
#include <iostream> 

/* a hash key for the visitedTrip table */ 
struct X { 
    int x; 

    X() : x(0){}; 
    X(int x) : x(x){}; 
}; 


typedef std::tr1::unordered_map<int,X> dict; 

int main() 
{ 
    dict c1; 

    X a(0); 
    X b(1); 
    X c(2); 

    c1[0] = a; 
    c1[1] = b; 
    c1[2] = c; 

    dict::const_iterator it; 

    for(it = c1.begin(); it != c1.end(); it++) 
     std::cout << it->first << std::endl; 

    return (0); 
} 

e poi cercato di compilare come segue:

compilazione. sh

#!/bin/bash 

# 
# Compiling for the simulator and compiling under gcc-4.0 return the same error message 
# 

#SUCCESS 
c++-4.2 -arch i386 bug.cpp 

#FAIL 
c++-4.0 -arch i386 bug.cpp 

#SUCCESS 
gcc-4.2 -arch i386 -c bug.cpp 

#FAIL 
gcc-4.0 -arch i386 -c bug.cpp 

#FAIL 
gcc-4.2 -arch i386 -c bug.cpp -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk 

Benche 'Sto usando gcc-4.2 per compilare per il simulatore, io sono sempre lo stesso messaggio di errore come se fossi la compilazione sotto gcc-4.0, vale a dire:

bug.cpp:27: error: no matching function for call to ‘Internal::hashtable_iterator<std::pair<const int, X>, false, false>::hashtable_iterator()’ 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:236: note: candidates are: Internal::hashtable_iterator<Value, is_const, cache>::hashtable_iterator(const Internal::hashtable_iterator<Value, true, cache>&) [with Value = std::pair<const int, X>, bool is_const = false, bool cache = false] 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:234: note:     Internal::hashtable_iterator<Value, is_const, cache>::hashtable_iterator(Internal::hash_node<Value, cache>**) [with Value = std::pair<const int, X>, bool is_const = false, bool cache = false] 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:232: note:     Internal::hashtable_iterator<Value, is_const, cache>::hashtable_iterator(Internal::hash_node<Value, cache>*, Internal::hash_node<Value, cache>**) [with Value = std::pair<const int, X>, bool is_const = false, bool cache = false] 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++/4.2.1/tr1/hashtable:225: note:     Internal::hashtable_iterator<std::pair<const int, X>, false, false>::hashtable_iterator(const Internal::hashtable_iterator<std::pair<const int, X>, false, false>&) 

Tutte le idee perché questo gcc-4.0 .x si insinua nel simulatore, quando in realtà si suppone che il simulatore utilizzi gcc-4.2.x dove questo bug è stato corretto?

+2

+1 per il codice Repro minimale e semplice - è così che dovrebbero essere poste le domande relative al codice – sbk

+0

xcode 3.1 o 3.2? leopardo delle nevi o leopardo? gcc/g ++ che viene fornito con xcode o altro? – slf

risposta

4

Non sono sicuro se questo è esattamente la risposta giusta, ma questo probabilmente spiega perché si sta vedendo il comportamento 4.0 durante l'uso 4.2:

> pwd 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/include/c++ 
> ls -l 
total 4 
drwxr-xr-x 10 root wheel 2278 10 Sep 09:32 4.0.0/ 
lrwxr-xr-x 1 root wheel  5 10 Sep 09:30 [email protected] -> 4.0.0 

Sembra che stanno cercando di utilizzare l'intestazione 4.0 impostato per entrambe le versioni, almeno su Snow Leopard con Xcode 3.2.

0

Controllerei attentamente le intestazioni della libreria (STL) a cui fa riferimento il simulatore.

0

A volte ci sono problemi con il compilatore in Xcode, forse hai un problema analogo a quello descritto qui.

UIKit SDK Error

In questo caso è necessario specificare il compilatore appositamente per il dispositivo e il simulatore. So che questo non ha senso, ma ha risolto il mio problema.

Problemi correlati