Código que compila para o dispositivo iPhone, mas não para o Simulator
Pergunta
Eu estou usando C ++ para desenvolver a parte algorítmica de um aplicativo para iPhone, e eu estou encontrando um erro estranho. O código que eu tenho, compila bem com gcc-4.2 tanto no Linux, no Mac, e no dispositivo iPhone, não apenas sobre o Simulator, o que torna a depuração e teste muito difícil.
As mensagens de erro das tentativas para compilar para o simulador de se assemelhar a um erro conhecido no 4.0.x, apesar de que não é muito claro porque desde que eu tenho explicitamente conjunto gcc-4.2 para ser o compilador padrão.
Para demonstrar o erro, eu preparei o seguinte pequeno trecho 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);
}
e, em seguida, tentou compilá-lo da seguinte forma:
compile.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
Mesmo admitindo que estou usando gcc-4.2 para compilar para o simulador, eu estou recebendo a mesma mensagem de erro como se eu estivesse compilando sob 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>&)
Todas as ideias de que esta gcc-4.0.x bugs se arrasta em simulador, quando na verdade o simulador é suposto estar usando gcc-4.2.x, onde este bug foi corrigido?
Solução
Não sei se isso é exatamente a resposta certa, mas isso provavelmente explica por que você está vendo o comportamento 4.0 ao usar 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 4.2.1@ -> 4.0.0
Parece que eles estão tentando usar o conjunto 4.0 cabeçalho para ambas as versões, pelo menos no Snow Leopard com o Xcode 3.2.
Outras dicas
Eu seria verificar cuidadosamente a biblioteca (STL) cabeçalhos que o simulador está referenciando.
Às vezes, há problemas de compilador no Xcode, talvez você tenha um problema análogo ao descrito aqui.
Neste caso, você tem que especificar o compilador especificamente para o dispositivo e simulador. Eu sei que isso não faz qualquer sentido, mas fixa o meu problema.
Há um problema com iteradores de unordered_map não ter construtores padrão em gcc-4.0.x
http://bytes.com/topic/c/ respostas / 607427-error-TR1-unordered_map-iterator
A inicialização em cima declaração deve corrigi-lo:
for(dict::const_iterator it = c1.begin(); it != c1.end(); it++)
std::cout << it->first << std::endl;