Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Un par de errores con xcode

Iniciado por NewMac, 19 de Enero de 2008, 07:47:57 PM

« anterior - próximo »

NewMac

Hola,

Estoy pasando un proyecto que tengo en windows a mac y después de repetir el ciclo: añadir archivos/compilar/corregir, me quedan un par de errores que no sé solucionar:

1) error: 'stricmp' was not declared in this scope

La linea donde da el error es tan simple como:

if ( stricmp( sName.c_str(), s_tRelObjectName[ i ].szName ) == 0 )

Esta include el <string.h>, y en windows me funciona. He estado buscando en foros y no he sacado nada en claro, pero uno decía que tenía un .h que incluía un .h que incluía un .h.... y que podía ser por eso, no lo sé :)

2) En los settings del proyecto, en Build/Language si dejo 'Compile Source As'  como 'According to File Type' cuando compilo me da errores a la hora de incluir las std ( <vector>, <string>...) y en las clases templatizadas, parece que lo intenta compilar como C en vez de C++ (los archivos tienen extension cpp). Si fuerzo a compilar como C++, los errores anteriores no me dan (solo tengo el de el scope). El problema es que estoy usando las SDL, y estas añaden  un archivo .m (objective c) y claro, este da mil errores al compilar con c++. Entonces no sé como indicarle que compile cada cosa con el compilador correcto :)

Un saludo.

Zaelsius

1) La función stricmp() no es portable. Tendrás que escribir tu propia versión.

2) Busca algun tutorial o proyecto simple de SDL/Xcode y mira qué configuración usa para cada fichero.

Me gustaría extenderme pero voy algo liado ahora mismo..

Martinez

A mi me paso lo mismo con strlwr al pasar a linux. Creo que esa funcion no es estandar, funciona en windows pero en otro ssoo puede que no.

Estas son las funciones ANSI C estandar:
http://www.conclase.net/c/librerias/libreria.php?lib=string

Mi consejo es que redefinas

#if !defined(WIN32)
// la funcion aqui
#endif

Sobre el tema 2 ni idea.

PD: por un minuto.

NewMac

Muchas gracias chicos, me pongo a ello, pero tened por seguro que volveré :)

EDITO:

Ya lo he corregido, pongo aquí lo que he hecho por si alguna vez alguien lo necesita:

1)


#ifndef _WINDOWS
   #define stricmp(str1,str2) strcasecmp(str1,str2)
#endif




2)
Lo que pasaba es que en la cabecera precompilada incluía las std, entonces al compilar el .m intentaba incluir eso y daba error. Lo he solucionado con:


#ifdef __OBJC__
   #import <Cocoa/Cocoa.h>
#else
   #include <vector>
   #include <string>
   #include <list>
   #include <map>
#endif

Martinez

#ifndef _WINDOWS
   #define stricmp(str1,str2) strcasecmp(str1,str2)
#endif

yo pondria esto mejor :

#ifndef _WINDOWS
   #define stricmp strcasecmp
#endif

NewMac

Como lo prometido es deuda, aquí estoy otra vez :) Solo quiero saber como indicar el directorio de trabajo. He leido por la web que las SDL establecen el directorio de trabajo y que se puede cambiar por medio de este código:


NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
[[NSFileManager defaultManager]
changeCurrentDirectoryPath:resourcePath];


en la función 'SetupWorkingDirectory':


/* Set the working directory to the .app's parent directory */
- (void) setupWorkingDirectory:(BOOL)shouldChdir
{
   if (shouldChdir)
   {
       char parentdir[MAXPATHLEN];
CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
if (CFURLGetFileSystemRepresentation(url2, true, (UInt8 *)parentdir, MAXPATHLEN)) {
       assert ( chdir (parentdir) == 0 );   // chdir to the binary app's parent
}
CFRelease(url);
CFRelease(url2);
}
}


Pero claro, yo no entiendo nada de objective c ni de lo que esas lineas hacen y no sé donde le puedo indicar el path que a mi me interesa.

Zaelsius

¿Cual quieres que sea tu directorio de trabajo?

Si lo que quieres es poder colocar tus recursos (imagenes, audio, etc) dentro del bundle, es decir, en Foo.app/Contents/Resources/, entonces la función SDLMain.m:setupWorkingDirectory() te tiene que quedar así:


Citar
- (void) setupWorkingDirectory:(BOOL)shouldChdir
{
if (shouldChdir)
{
 NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
 [[NSFileManager defaultManager]
 changeCurrentDirectoryPath:resourcePath];
}
}


Pero aun no estoy seguro de si es eso lo que quieres hacer.

NewMac

Dentro del directorio de la aplicación tengo un directorio data y otro src.


Foo
  \Data
  \Src
      foo.xcodeproj



Me gustaría poder indicar 'data' como directorio de trabajo. Pero bueno, que llegado el caso puedo colocar mi data donde se espera que esté, pero sigo sin saber muy bien donde es :). Con foo.app/ te refieres a build/debug/foo.app?, pero foo.app es un archivo, no un directorio, tengo que crear ahí un directorio Contents?

Gracias y un saludo.

Zaelsius

A ver, que nos liamos..

Un .app es un directorio. Pulsa el botón secundario sobre él y elige la opción "mostrar contenidos del paquete"(o similar). Tacháaan :D

En Mac OS X, lo recomendado es que los recursos de la aplicación vayan contenidos en el propio .app, simplificando al máximo la instalación/desinstalación y ocultado al usuario detalles innecesarios.

Normalmente los recursos cuelgan de foo.app/Contents/Resources. Si añades ficheros a la carpeta 'resources' del proyecto de Xcode, al compilar, dichos ficheros se copiarán automáticamente al bundle.



En caso de que no me quieras hacer caso:

Puedes configurar el directorio de trabajo de la aplicación al lanzarla o depurarla desde Xcode. Esto se puede cambiar en las opciones del proyecto(busca 'working directory'). Ahora mismo tu directorio de trabajo se encuentra obviamente en '/build/debug', que es donde se genera el .app.

Si quieres leer ficheros de '/Data', o bien mueves el .app ahí (poco práctico) o configuras el directorio de trabajo del 'target' foo.app para que apunte al directorio raíz del proyecto. Una vez hecho eso, y tal y como se lo monta SDL, deberías poder acceder a tus ficheros usando algo como fopen( "Data/foo.bmp"... ) .. suponiendo que siempre ejecutes desde Xcode o que tanto .app como carpeta Data estén en el mismo directorio.


Sé que me he explicado regular, pero es complicado presentar tantos conceptos nuevos a la vez  y ahora mismo no puedo extenderme mucho más.

Malandrin

Que interesante lo del .app que en realidad es un directorio, así sí que quedan las cosas ordenadas, pero en mi caso no me vale porque quiero que en un CD vaya tanto la versión windows como la mac.

Después de muchas lágrimas por fin descubrí porque no me leía los fichero los pusiera donde los pusiera, estaba utilizando \\ para acceder a directorios en vez de /, una vez descubierto y cambiado todas las barras de sentido ya funciona todo bien.

Gracias por vuestra ayuda, un saludo.

carallo29

Citar
- (void) setupWorkingDirectory:(BOOL)shouldChdir
{
if (shouldChdir)
{
  NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
  [[NSFileManager defaultManager]
  changeCurrentDirectoryPath:resourcePath];
}
}


ZaelSiuS en lugar de como pusiste, la función setupWorkingDirectory no quedaría mas bien de esta otra manera ?

Citar
- (void) setupWorkingDirectory:(BOOL)shouldChdir
{
   NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
   [[NSFileManager defaultManager] changeCurrentDirectoryPath:resourcePath];
}


porque de la otra manera solo funciona cuando arrancas la aplicación con doble click, al menos con el SDLMain.m que tengo yo claro, jeje

Zaelsius

/carallo29<necromancer> casts 'bring back from the death' on post 'un par de errores con xcode'

A la pregunta.. ni idea, no soy usuario habitual de SDL. Solo le dí un ejemplo cambiando el cuerpo de una función que pegaron más arriba.

En cualquier caso, seguro que los que lean este hilo en el futuro te agradecen la aportación :)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.