c++ - qtranslator - qt translator
Qt, MSVC y/Zc: wchar_t-== Quiero explotar el mundo (4)
Estoy de acuerdo con el comentario de Öö Tiib
Esa opción quizás sea por compatibilidad con algún viejo código pre-wchar_t heredado.
Teniendo en cuenta que Qt se transfiere a muchas plataformas diferentes (incluidos los sistemas integrados), algunas de las cuales no tienen un compilador decente de C ++, supongo que este cambio solo posibilita la compilación de Qt en esas plataformas. Quiero decir que probablemente no sea algo en lo que Qt confíe para funcionar correctamente. Si fuera el caso, significaría que el diseño de Qt está profundamente roto en mi opinión. Entonces la opción 1 debería funcionar.
Habiendo dicho eso, definitivamente recomendaría elegir la opción 3 porque
-
wchar_t
te da casi nada con respecto a i18n - como notaron, Qt tiene una clase de cuerdas muy capaz que hace que i18n sea una tarea fácil (ver Internacionalización con Qt )
Puede consultar los results de la búsqueda de wchar_t
en la lista de [email protected] , hacer su pregunta allí y hablar con Thiago Macieira en freenode.net #qt irc channel, donde Thiago está muy activo.
Entonces Qt se compila con / Zc: wchar_t- en Windows. Lo que esto significa es que en lugar de que wchar_t sea un typedef para algún tipo interno (__wchar_t creo) se convierte en un typedef para unsigned short
. Lo realmente bueno de esto es que el valor predeterminado para MSVC es el opuesto, lo que, por supuesto, significa que las bibliotecas que está utilizando probablemente se hayan compilado con wchar_t
es un tipo diferente al wchar_t
de Qt.
Esto no se convierte en un problema, por supuesto, hasta que intentes utilizar algo como std::wstring
en tu código; especialmente cuando una o más bibliotecas tienen funciones que lo aceptan como parámetros. Lo que efectivamente ocurre es que su código se compila felizmente pero luego falla al vincularse porque está buscando definiciones usando std::wstring<unsigned short...>
pero solo contienen definiciones que esperan std::wstring<__wchar_t...>
(o lo que sea) )
Así que hice una búsqueda web y encontré este enlace: https://bugreports.qt.io/browse/QTBUG-6345
En base a la declaración de Thiago Macieira, "Lo siento, no apoyaremos la construcción de Qt de esta manera", me ha preocupado que la corrección de Qt para que funcione como todo lo demás podría causar algún problema y haber estado tratando de evitarlo. Recopilamos todas nuestras bibliotecas de soporte con / Zc: wchar_t- flag y hemos estado bastante contentos con eso hasta hace un par de días cuando empezamos a tratar de realizar un cambio de puerto (estamos en el proceso de cambiar de Wx a Qt) alguna serialización código.
Debido a la forma en que funciona win32, y debido a que Wx solo envuelve a win32, hemos estado usando std::wstring
para representar datos de cadena con la intención de hacer que nuestro producto esté lo más listo posible. Hicimos algunas pruebas y Wx no funcionó con caracteres multibyte al intentar imprimir cosas especiales (incluso cosas no tan especiales como el símbolo de grado era un problema). No estoy tan seguro de que Qt tenga este problema, ya que QString no es solo un envoltorio del tipo _TCHAR subyacente, sino que es un monstruo Unicode de algún tipo.
En cualquier caso, la biblioteca de serialización en boost tiene partes compiladas. Hemos intentado recompilar el impulso con / Zc: wchar_t- pero hasta ahora nuestros intentos de decirle a bjam que lo hagan no han sido atendidos. Estamos en un callejón sin salida.
Desde donde estoy sentado tengo tres opciones:
Recompile Qt y espero que funcione con / Zc: wchar_t. Hay cierta evidencia en la web de que otros lo han hecho, pero no tengo manera de predecir lo que sucederá. Todos los intentos de preguntarle a la gente de Qt en foros no han sido respondidos. Demonios, incluso en ese informe de errores, alguien pregunta por qué y se quedó allí durante un año.
Sigue luchando con bjam hasta que escuche. En este momento, tengo a alguien debajo de mí que hace eso y tengo más experiencia luchando con cosas para conseguir lo que quiero, pero tengo que admitir que me canso de eso. También me preocupa que SIGA encontrándome con este problema solo porque Qt quiera ser ac ** t.
Deja de usar wchar_t por cualquier cosa. Lamentablemente, mi experiencia con i18n es casi 0, pero me parece que solo necesito encontrar la función de derecha / izquierda en QString (tiene un BUNCH) para codificar el Unicode en 8 bytes y viceversa. Las funciones de UTF8 parecen prometedoras, pero realmente quiero asegurarme de que no se perderán datos si alguien de Zimbabfuckegypt comienza a escribir en su propio idioma y la documentación en QString me asusta un poco al pensar que eso podría suceder. Por supuesto, siempre podría encontrarme con alguna biblioteca que insiste en que use wchar_t y luego regrese a 1 o 2, pero dudo que eso suceda.
Entonces, ¿cuál es mi pregunta ...
¿Cuál de estas opciones es mi mejor apuesta? ¿Acaso Qt va a hacer que me arranque mis propios ojos porque decidí compilarlo con / Zc: wchar_t de todos modos?
¿Cuál es el encantamiento mágico para obtener impulso para construir con / Zc: wchar_t- y eso causará daño mental permanente?
¿Puedo salirme usando simplemente las clases de caracteres estándar de 8 bits (bueno, ''común'' de todos modos) y estar listo / listo para i18n?
¿Cómo lidian otros desarrolladores de Qt con este lío?
Poniendo esto aquí como una respuesta porque es demasiado largo para hacer comentarios.
Esta es una de las respuestas a por qué uno podría estar recibiendo LNK2019 también conocido como error de enlazador de "símbolo no encontrado" ( source ):
- Mezcla código que usa wchar_t nativo con código que no lo hace. El trabajo de conformidad del lenguaje C ++ que se realizó en Visual C ++ 2005 hizo
wchar_t un tipo nativo por defecto. Debe usar / Zc: wchar_t-
opción del compilador para generar código compatible con módulos compilados por
utilizando versiones anteriores de Visual C ++. Si no todos los módulos han sido
compilado utilizando las mismas / Zc: configuración wchar_t, escriba referencias puede
no resolver a tipos compatibles. Verifique que los tipos wchar_t en todos
los módulos son compatibles, ya sea actualizando los tipos que se usan,
o mediante el uso de configuraciones consistentes / Zc: wchar_t cuando compila.
Así que esa podría ser la razón principal por la cual / Zc: wchar_t- está presente en todos los archivos mkspec relacionados con cl.exe y también por qué probablemente no lo necesite.
Me gusta tener wchar_t
nativo porque hace que a veces sea fácil convertir entre las cadenas que espera la API de Windows y QString.
Tropezó con el mismo problema ... Obviamente, bjam espera que cxxflags=-Zcwchar_t-
Después de compilar las libs de serialización estática a través de
bjam --with-serialization toolset=msvc-8.0 variant=debug threading=multi link=static cxxflags=-Zc:wchar_t-
todo vinculado como esperado.
Espero que esto ayude a cualquiera.
wchar_t debe escribirse como bool o long. No se necesitan encabezados para definirlo.
Usaste esa opción "wchar_t is undefined type". Luego, escribe def wchar_t como unsigned short y luego se pregunta si ya nada funciona.
Esa opción quizás sea por compatibilidad con algún viejo código pre-wchar_t heredado. Simplemente ... nunca lo use. De lo contrario, nada de C ++ se vincula porque las funciones que toman los parámetros wchar_t tienen un nombre diferente que las funciones que toman los parámetros cortos sin signo.
Si se compila alguna biblioteca con algunas opciones extrañas, compórtala con las opciones correctas. Cuando sea necesario, arregle su código. Si no puede hacerlo, no debe usar esa biblioteca. Cada línea de código en su proyecto de C ++ es suya para mantener.