2009-09-20 13 views
8

Estoy usando C++ para desarrollar la parte algorítmica de una aplicación de iPhone, y me encuentro con un error extraño. El código que tengo, compila bien con gcc-4.2 tanto en Linux, en la Mac y en el dispositivo iPhone, pero no en el simulador, lo que hace que la depuración y las pruebas sean muy difíciles.Código que compila para el dispositivo iPhone pero no para el simulador

Los mensajes de error de los intentos de compilación para el simulador se asemejan a un error conocido en 4.0.x, aunque no está muy claro por qué dado que he configurado explícitamente gcc-4.2 para que sea el compilador predeterminado.

Para demostrar el error, he preparado el siguiente pequeño fragmento de código:

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); 
} 

y luego tratado de compilar la siguiente manera:

de compilación. 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 

Eventhough estoy usando gcc-4.2 para compilar para el simulador, yo estoy recibiendo el mismo mensaje de error como si estuviera compilando bajo gcc-4.0, a saber:

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>&) 

¿Alguna idea de por qué esto gcc-4.0 El error .x se introduce en el simulador, cuando de hecho se supone que el simulador está usando gcc-4.2.x donde se ha corregido este error.

+2

+1 para el código de repro mínima y sencilla - Así es como deberían formularse las preguntas relacionadas con el código – sbk

+0

xcode 3.1 o 3.2? leopardo de las nieves o leopardo? gcc/g ++ que viene con xcode u otro? – slf

Respuesta

4

No estoy seguro si esto es exactamente la respuesta correcta, pero esto probablemente explica por qué se está viendo el comportamiento durante el uso de 4.0 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 

Parece que están tratando de utilizar el encabezado 4.0 configurado para ambas versiones, al menos en Snow Leopard con Xcode 3.2.

0

Verificaría cuidadosamente los encabezados de la biblioteca (STL) a los que hace referencia el simulador.

0

A veces existen problemas con el compilador en Xcode, tal vez tenga un problema análogo al descrito aquí.

UIKit SDK Error

En este caso se tiene que especificar el compilador específicamente para el dispositivo y el simulador. Sé que esto no tiene ningún sentido pero solucionó mi problema.

Cuestiones relacionadas