problemas al compilar una apliacion en harbour

18/03/2010

Al hacer la conversion de FlagShip a Xharboru se presentaron varios
inconvenietes

1. El proceso de compilacion y posterior link del la aplicacion no
tiene practicamnte ninguna documentacion , ni siquiera en internet, la
mayoria de las consultas e informacion estan dirigidas a windows y a
procesos guiados por interfaces graficas como QAC y XEdit, las cuales
no corren en linux.

Despues de buscar en el propio sistema encontre la herramienta hbmake
la cual es tambien una interface aunque texto, sin embargo posee una
cantidad de parametros de los cuales no hay informacion por ninguna
parte de xharbour, siempre fallaba pero no sabia porque, ya que la
pantalla no muestra los error que presenta la compilacion ni posterior
link. ademas no dicen por ninguna parte que se supone que hace la
pantalla de parametrizacion de hbmaker.

Trate de hacer un script a modo de sistema de
compilacion donde nme pudiera dar cuenta de lo que estaba pasando en
el proceso. este fue el guion que emplee

lo denomine compila: (recordar que para que un guiones funcionen en
linux hay que darle permisos, yo le di todos los permisois asi

#chmod ugo+wrx compila.

Luego cooloque este donde tenia todos mis modulos *.prg.
en mi caso cree un directorio

#mkdir /home/ksos/conta

y alli guarde todos mis *.prg

compila:
--------------------------------------------------------------------
clear
date
echo '******************************************************'
echo '* Compilacion en Harbour *'
echo '* recordar instalar gpm-devel para que link funcione *'
echo '******************************************************'

# hace un listado del directorio de modulos *.prg uno por linea

ls -1 *.prg > sos1

# Borra los caracteres * que ls -1 deja al final de cada item

sed 's/*/ /' sos1 > sos2

# en sos2 queda el archivo de modulos depurado que se pasa como
# parametro al comilador harbour con la Flag @sos2

# -gh hace un objeto *.hbr y -gf un objeto *.obj en windows
# -go hace un objeto *.o
# -m compila los prg solo como modulos no buscar recursivamente
# -no exige que los procedure existan por cada modulo
# -n1 y n2 lo genera a partir del nombre del modulo
# -l suprime la informacin de lineas para el debug
# en @sos2 estan todos los programas *.prg

harbour -D__EXPORT__ -l -m -n0 -go @sos2 1>error.log
xhblnk -Wl,--noinhibit-exec -static -gtcrs -oactual.out actual.o \
ventana.o enter.o escape.o logo_ofi.o clave.o

---------------------------------------------------------------------

Los parametros que quedaron al fin los fui colocando segun la pantalla
de ayuda de harbour

# harbour
-gh output type: Harbour Portable Object (.hrb)
-i #include file search path
-j[] output i18n support [to ] to .hil
-k compilation mode (type -k? for more data)
-l suppress line number information
-m compile module only
-n[] no implicit starting procedure (default)
: 0=no implicit starting procedure
1=no starting procedure at all
2=force application starting
-procedure
-o object file drive and/or path
-p[o] generate pre-processed output (.ppo) file
-in
-pt[o] generate pre-processor trace (.ppt) file in
-
-q quiet
-q0 quiet and don't display program header
-s syntax check only
-u[[+]] use command def set in (or none)
-undef: #undef
-v variables are assumed M->
-vd external functions are assumed as dynamic
-functions
-w[] set warning level number (0..3, default 1)
-x[] set symbol init function name prefix (for
-.c only)
-z suppress shortcutting (.and. & .or.)
@ compile list of modules in

igual hice con los xhblnk,en este ultimo comando no sabia que existia
pero si tenia claro que el solo xharbour no generaba ejecutables
porque eso si se dice por todas partes, que harbour crea son p_code o
maximo archivos *.o los que hay que enlazar ahora el problema era
como ?.

Existe un sin fin de literarura de como se usan las interfaces
xedid y QAC donde es un proceso trasparente para el usuario una vez se
configura pero para linux nada de nada.

Supuse que deberia haber un comando para hacer el
encadenamiento con alguna terminacion en link, como es tradicional y
busque en los paquetes de instalacion *.RPM que habia descargado y
le pregunte al sistema si tenia algo con este cadana
El comando fue:

#fgrep -y 'xhblnk' *.rpm

ls respuesta fue alentadora
Coincidencia en el fichero binario xharbour-1.2.0-0mdv20090.i586.rpm
Coincidencia en el fichero binario xharbour-lib-1.2.0-0mdv20090.i586.rpm
Coincidencia en el fichero binario xharbour-pp-1.2.0-0mdv20090.i586.rpm
Coincidencia en el fichero binario xharbour-static-1.2.0-0mdv20090.i586.rpm

es decir si existia ahora cual era ?
un simple:

# less xharbour-1.2.0-0mdv20090.i586.rpm

me mostro toda la cadena del rpm lo que andaba buscando, ahora con el comando
/s link en la linea de mando del less me llevo a /usr/bin/xhblnk

ya lo habia encontrado entonce era ver como se usaba

telee
# xhblnk

"xhbcc", "xhbcmp", "xhblnk" and "xhbmk" parameters:
-o # output file name
"xhblnk" and "xhbmk" parameters:
-static # link with static xharbour libs
-fullstatic # link with all static libs
-shared # link with shared libs (default)
-mt # link with multi-thread libs
-gt # link with GT driver, can be repeated
to
# link with more GTs. The first one will be
# the default at runtime
-xbgtk # link with xbgtk library (xBase GTK+
interface)
-xhgtk # link with xHGtk library (GTK+ interface)
-hwgui # link with HWGUI library (GTK+ interface)
-l # link with library
-L # additional path to search for libraries
-fmstat # link with the memory statistics lib
-nofmstat # do not link with the memory statistics lib
(default)
-[no]strip # strip (no strip) binaries
-main= # set the name of main program
function/procedure.
# if not set then 'MAIN' is used or if it
doesn't
# exist the name of first public
function/procedure
# in first linked object module (link)

Ahi estaban todas las opciones de encadenamiento algunas mas o menos
esotericas las otras normalitas de cualquier link de C.

hice una prueba
xhblnk -Wl,--noinhibit-exec -static -gtcrs -oactual.out actual.o \
ventana.o enter.o escape.o logo_ofi.o clave.o

Tal como figura en el script compila con algunos parametros que
conocia de otros encadenadores pà ra avr-gcc y como eran similares los
emplee,inmediatamente me saco un error:

************* libreria lgpm no encontrada sistema abortado

NO sabia que era,pues supuestamene ya habia bajado todo los archivos
del sitio de wwwx.xharbour.org , desinstale el sistema y lo volvi a
instalar, nada el mismo error, por pura reduccion a lo absurdo ,
observe que lgpm es parecida a las libreria de desarrollo de linux
para uso de mouse en modo texto, fui a los paquetes de instalacion
de linux y descargue gpm-devel, corri de nuevo la prueba y
compilo y encadeno correctamente

Aunque no me funciono totalmente,pues una cosa es usar un par de
modulos actual.o y ventana.o y otra muy distinta usar mas de 200
modulos, no puede encontrar como enlazarlos todos de una vez, este
trabajo esta pendiente en mi guion, no me quedo sin verlo funcionando
aunque solo sea por la honrilla, de programador y me quiera llevar la
victoria moral.

Sin embargo el script compila me permitio ir viendo lo que estaba
pasando en sistema, el comando script (este un comando linux) me
ayudo a ir encontrando los error de sintasis mas gruesos.
los cuales quedaban en el archivo error.log a la salida del comando
harbour. en el guion compila

este comando lo corria dentro del comando script
para genere un trazado de ejecucion y 1>error.log muestra un log de el
proceso ya tenia entonces uhna herramienta para hacer el debug del
sistema, a su nivel mas basico.

el prooceso fue:
# script sos
# compila
# exit

Quedan dos archivos:
sos generado por el script y
error.log generado por el proceso 1>error.log de harbour.

Empece entonce a verificar los errores y tratar de corregirlos.

Comentarios

Entradas populares