Compilar en Ubuntu

Compilar en Ubuntu

Postby Verhoven » Tue Dec 15, 2009 11:08 am

Estoy empezando a compilar en Ubuntu, de momento solo en modo consola, y me encuentro con que consigo pasar el prg a c con Harbour pero luego con el gcc no consigo generar el ejecutable.
He hecho lo siguiente:

1º.- Instalar en SVN (Source Version control system):
sudo apt-get install subversion

2º.- Descargar de sourceforge la version de Harbour al directorio harbour-project en el directorio local del usuario que haya ejecutado la siguiente instrucción:
svn co https://harbour-project.svn.sourceforge ... ur-project harbour-project

Esto tarda un ratillo.

3º.- Ahora se compila la versión descargada con el fichero descargado make_gnu.sh:
i.- Cambiamos al directorio donde está el fichero:
cd ./harbour-project/branches/harbour-1.0

ii.- Cambiamos los atributos de make_gnu.sh para hacerlo ejecutable:
chmod +x ./make_gnu.sh

iii.- Echamos a andar el fichero:
./make_gnu.sh

4º.- Con esto ha quedado compilado el harbour.

5º.- Ahora copiamos lo necesario al arbol de directorios apropiado:
Creamos, colgando de nuestro directorio local la siguiente estructura de directorios:
harbour
/bin
/lib
/include
/doc


6º.- Copiamos los ficheros:
i.- En /bin el ejecutable que la compilacion de harbour a generado en el directorio: harbour-project/branches/harbour-1.0/source/main/linux/gcc
ii.- En /lib todos los archivos generados en: harbour-project/branches/harbour-1.0/lib/linux/gcc
iii.- En /include todos los archivos generados en: harbour-project/branches/harbour-1.0/include
iv.- En /doc todos los archivos presentes en: harbour-project/branches/harbour-1.0/doc

7º.- Ahora edito un programa.prg básico como:
function main()
? "Hola Mundo"
return


8º.- Lo compilo con Harbour:
./harbour/bin harbour programa.prg -n -I ./../include -I./../../harbour/include
y con esto se genera el fichero programa.c

9º.- Aquí es don de me falla la obtención del ejecutable:
gcc programa.c -c -I./../include
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Antonio Linares » Tue Dec 15, 2009 12:19 pm

> gcc programa.c -c -I./../include

Que error te da ?

Copia aqui la salida de pantalla, gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42097
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Compilar en Ubuntu

Postby Verhoven » Wed Dec 16, 2009 8:42 pm

sdp@sdp-desktop:~/harbour$ gcc prueba.c -c -I./../include
prueba.c:7:21: error: hbvmpub.h: No existe el fichero ó directorio
prueba.c:8:20: error: hbinit.h: No existe el fichero ó directorio
prueba.c:11: aviso: la definición de datos no tiene tipo o clase de almacenamiento
prueba.c:11: aviso: nombres de parámetros (sin tipos) en la declaración de la función
prueba.c:12: aviso: la definición de datos no tiene tipo o clase de almacenamiento
prueba.c:12: aviso: nombres de parámetros (sin tipos) en la declaración de la función
prueba.c:13: aviso: la definición de datos no tiene tipo o clase de almacenamiento
prueba.c:13: aviso: nombres de parámetros (sin tipos) en la declaración de la función
prueba.c: En la función ‘HB_INIT_SYMBOLS_BEGIN’:
prueba.c:17: error: expected expression before ‘{’ token
prueba.c: En el nivel principal:
prueba.c:17: error: expected identifier or ‘(’ before ‘,’ token
prueba.c:18: error: expected identifier or ‘(’ before ‘,’ token
prueba.c:20: error: expected ‘)’ before string constant

sdp@sdp-desktop:~/harbour$
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Antonio Linares » Wed Dec 16, 2009 10:26 pm

Si la carpeta include es hija de la carpeta harbour, entonces tendrias que compilar asi:

gcc prueba.c -c -I./include
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42097
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Compilar en Ubuntu

Postby Verhoven » Fri Dec 18, 2009 9:16 am

Correcto, con esto genera el fichero programa.o (objeto)

Me queda generar el .exe que no se como se hace.
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Verhoven » Sat Dec 19, 2009 10:17 am

Lo estoy intentando generar con las siguientes instrucciones, pero sigue sin funcionar:
Me da los mensajes siguientes:

./bin/harbour prueba.prg -n -I./../include -I./../../harbour/include
Harbour 1.0.2dev Intl. (Rev. 9676)
Copyright (c) 1999-2008, http://www.harbour-project.org/
Compiling 'prueba.prg'...
Lines 3, Functions/Procedures 1
Generating C source output to 'prueba.c'... Done.

[gcc -W -Wall -o prueba.exe prueba.c -I./include
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'
/tmp/cco7NRXa.o: In function `hb_vm_SymbolInit_PRUEBA':
prueba.c:(.text+0x2e): undefined reference to `hb_vmProcessSymbolsEx'
/tmp/cco7NRXa.o: In function `HB_FUN_MAIN':
prueba.c:(.text+0x50): undefined reference to `hb_vmExecute'
/tmp/cco7NRXa.o:(.data+0x18): undefined reference to `HB_FUN_QOUT'
collect2: ld devolvió el estado de salida 1

~/harbour$ sudo ./prueba.exe
sudo: ./prueba.exe: command not found

No se si es que me falta algún include en el prg o que no uso bien las opciones del compilador gcc.
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Verhoven » Sat Dec 19, 2009 10:25 am

He añadido al compilador gcc delante de prueba.c la opcion -c y ahora genera el fichero prueba.exe pero me da el siguiente error:
~/harbour$ ls
bin doc hbbuild.sh hbbuild.sh~ include lib prueba.c prueba.exe prueba.o prueba.prg prueba.prg~
~/harbour$ chmod +x prueba.exe
~/harbour$ sudo ./prueba.exe
./prueba.exe: 1: Syntax error: word unexpected (expecting ")")
~/harbour$

En fin, ya no se qué hacer.
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Antonio Linares » Sat Dec 19, 2009 10:39 pm

Aqui tienes un ejemplo de cómo hacerlo:

viewtopic.php?p=49076#p49076
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42097
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Compilar en Ubuntu

Postby Verhoven » Mon Dec 21, 2009 10:21 am

Antonio, me vas a perdonar por mi ignorancia, pero no soy capaz.
Más de 30.000 líneas de código funcionando correctamente en windows y no soy capaz de compilar un simple "hola mundo" en linux.
Es frustrante y desalentador. Esto es lo que exaspera de linux. He probado algo con python y oye, a la primera.
En fin, no me gusta resultar pesado, pero te ruego si puedes ser más explicito en cuanto a la instrucción exacta que haya que usar gcc porque no hay manera.
La estructura de directorios que utilizo es colgando del directorio personal tengo:
harbour
/bin
/lib
/include
/doc

Saludos y nuevamente Feliz Navidad.
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Antonio Linares » Mon Dec 21, 2009 7:02 pm

Este build.sh acabo de probarlo en Ubuntu, sin usar FiveLinux, y ha funcionado a la primera:
Code: Select all  Expand view

# ./build.sh

clear

if [ $# = 0 ]; then
   echo syntax: ./build.sh file [options...]
   exit
fi

echo compiling...
./../../harbour/bin/harbour $1 -n -I./../include -I./../../harbour/include $2

echo compiling C module...
gcc $1.c -c -I./../include -I./../../harbour/include

echo linking...
gcc $1.o -o$1 -L./../lib -L./../../harbour/lib -Wl,--start-group -lcommon -lvm -lrtl -lrdd -lmacro -llang -lcodepage -lpp -ldbfntx -ldbfcdx -ldbffpt -lhbsix -lusrrdd -lct -lgtstd -ldebug -lm -lgpm -lncurses -Wl,--end-group

rm $1.c
rm $1.o

echo done!
./$1
 

Solo tendrías que actualizar los nombres de las librerias para Harbour
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42097
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Compilar en Ubuntu

Postby Verhoven » Tue Dec 22, 2009 8:00 am

Antonio, los nombres de las librerias que tengo son ligeramente distintos, en concreto el proceso de construcción de harbour descrito en el mensaje inicial de este hilo da como resultado las siguientes librerias que ha copiado en el directorio /harbour/lib que cuelga de mi carpeta personal:
libgtcgi.a libgtpca.a libgtstd.a libgttrm.a libhbbmcdx.a libhbbtree.a libhbclipsm.a libhbcommon.a libhbcpage.a libhbcplr.a libhbct.a libhbdebug.a libhbextern.a libhbgt.a libhbhsx.a libhblang.a libhbmacro.a libhbmisc.a libhbmsql.a libhbmzip.a libhbnf.a libhbnulrdd.a libhbpcre.a libhbpp.a libhbrdd.a libhbrtl.a libhbsix.a libhbsqlit3.a libhbtip.a libhbtpathy.a libhbusrrdd.a libhbvm.a libhbvpdf.a libhbziparc.a libhbzlib.a
librddado.a librddcdx.a librddfpt.a librddntx.a libxhb.a

He añadido ese "libhbb" y el ".a " a los nombres de las librerias que aparecen en tu "build.sh" pero me dice al linkar que no encuentra "libhbcommon.a", que es la primera de la lista del "build.sh" y se para el gcc. Además no entiendo las secuencias gcc del proceso del linkado -L./../lib -L./../../harbour/lib . ¿Porqué aparecen dos /lib? y ¿A que ruta hacen referencia ./../lib y ./../../harbour/lib?. Creo que dada la estructura de directorios que tengo (la recomendada al instalar harbour) debería de ser solo -L./harbour/lib, es decir, la instrucción de linkado con gcc quedaría, dado que estamos situados en el directorio harbour que cualega de la carpeta personal:

gcc $1.o -o$1 -L./lib -Wl,--start-group -libhbcommon.a -libhbvm.a -libhbrtl.a -libhbrdd.a -libhbmacro.a -libhblang.a -libhbcodepage.a -libhbpp.a -libhbdbfntx.a -libhbdbfcdx.a -libhbdbffpt.a -libhbhbsix.a -libhbusrrdd.a -libhbct.a -libhbgtstd.a -libhbdebug.a -libhbm.a -libhbgpm.a -libhbncurses.a -Wl,--end-group

en vez de:
gcc $1.o -o$1 -L./../lib -L./../../harbour/lib -Wl,--start-group -lcommon -lvm -lrtl -lrdd -lmacro -llang -lcodepage -lpp -ldbfntx -ldbfcdx -ldbffpt -lhbsix -lusrrdd -lct -lgtstd -ldebug -lm -lgpm -lncurses -Wl,--end-group

Pero esto tampoco funciona porque, como digo, no encuentra la primera libreria del grupo y se para.

Yo creo que va a ser más facil que me toque hoy el gordo de la Lotería que conseguir compilar el "hola mundo" en linux.
Cuando lo haya conseguido, aunque me haya tocado el gordo, voy a dejar en el foro un mensaje refundiendo todo el asunto.

Que haya suerte.
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Antonio Linares » Tue Dec 22, 2009 8:21 am

-L./../lib tienes que quitarlo pues es para FiveLinux. Disculpame, es que usé el de FiveLinux con unas modificaciones.

Asegúrate de que tienes el fichero libhbcommon.a construido.

Una vez resuelvas estos detalles, verás que la compilación en Linux es tan sencilla como en Windows. Lo que pasa es que estamos muy acostumbrados a "pensar" en Windows debido a tantos años usándolo... :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42097
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Compilar en Ubuntu

Postby Verhoven » Tue Dec 22, 2009 8:57 am

Antonio, no entiendo que quieres decir con tener "construida" la libreria. Siguiendo las instrucciones expuestas para construir lo que te bajas del sourceforge he ejecutado make_gnu.sh y entendía que con eso se generaba el compilador de harbour y las librerias. ¿Hay que hacer algo más para construir las librerías?.

El error que me arroja es:
compiling...
Harbour 1.0.2dev Intl. (Rev. 9676)
Copyright (c) 1999-2008, http://www.harbour-project.org/
Compiling 'prueba.prg'...
Lines 3, Functions/Procedures 1
Generating C source output to 'prueba.c'... Done.
compiling C module...
linking...
/usr/bin/ld: cannot find -libhbcommon.a
collect2: ld returned 1 exit status
done!
./build2.sh: línea 23: ./prueba: No existe el fichero ó directorio
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Re: Compilar en Ubuntu

Postby Antonio Linares » Tue Dec 22, 2009 12:08 pm

Ya ví lo que te ocurre :-)

En Linux no se escribe el prefijo "lib" ni la extensión ".a" aunque lo use el nombre del fichero. Asi en vez de:

-libhbcommon.a

tienes que escribir:

-lhbcommon

-l indica que es un fichero lib :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42097
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Compilar en Ubuntu

Postby Verhoven » Tue Dec 22, 2009 4:17 pm

Antonio, yo creo que ya falta muy poco, para compilar en linux porque lo que es para que me toque el gordo queda otro año.

He metido en el build.sh que pusiste más arriba todas las librerías que se generan en ./lib, sustituyendo el lib inicial por -l y quitando el .a, y modificando el nombre de alguna como codepage por la que me entendía más parecida como cpage (hbcpage), porque los nombres no son todos iguales, y metiendo al final de la lista que tu pones en el build.sh el resto, hasta completar todas, las que constan en ./lib y me arroja el siguiente error:

compiling...
Harbour 1.0.2dev Intl. (Rev. 9676)
Copyright (c) 1999-2008, http://www.harbour-project.org/
Compiling 'prueba.prg'...
Lines 3, Functions/Procedures 1
Generating C source output to 'prueba.c'... Done.
compiling C module...
linking...
./lib/libhbvm.a(hvm.o): In function `hb_vmModulus':
hvm.c:(.text+0x551e): undefined reference to `fmod'
./lib/libhbvm.a(hvm.o): In function `hb_vmPower':
hvm.c:(.text+0x560d): undefined reference to `pow'
./lib/libhbrtl.a(math.o): In function `HB_FUN_EXP':
math.c:(.text+0x7dd): undefined reference to `exp'
./lib/libhbrtl.a(math.o): In function `HB_FUN_LOG':
math.c:(.text+0x912): undefined reference to `log'
./lib/libhbrtl.a(math.o): In function `HB_FUN_SQRT':
math.c:(.text+0xa4a): undefined reference to `sqrt'
./lib/librddntx.a(dbfntx1.o): In function `hb_ntxSortNew':
dbfntx1.c:(.text+0xb6fc): undefined reference to `sqrt'
dbfntx1.c:(.text+0xb70a): undefined reference to `ceil'
dbfntx1.c:(.text+0xb752): undefined reference to `sqrt'
dbfntx1.c:(.text+0xb75a): undefined reference to `ceil'
./lib/libhbcommon.a(hbstr.o): In function `hb_numPow10':
hbstr.c:(.text+0x4bb): undefined reference to `pow'
./lib/libhbcommon.a(expropt2.o): In function `hb_compExprReduceMod':
expropt2.c:(.text+0x4b1): undefined reference to `fmod'
./lib/libhbcommon.a(expropt2.o): In function `hb_compExprReducePower':
expropt2.c:(.text+0xa2b): undefined reference to `pow'
expropt2.c:(.text+0xa4d): undefined reference to `pow'
expropt2.c:(.text+0xa6c): undefined reference to `pow'
expropt2.c:(.text+0xaa0): undefined reference to `pow'
expropt2.c:(.text+0xacb): undefined reference to `pow'
collect2: ld returned 1 exit status
done!
./build4.sh: línea 23: ./prueba: No existe el fichero ó directorio


El build4.sh que he usado es el siguiente:

# ./build4.sh

clear

if [ $# = 0 ]; then
echo syntax: ./build2.sh file [options...]
exit
fi

echo compiling...
./bin/harbour $1.prg -n -I./include

echo compiling C module...
gcc $1.c -c -I./../include -I./include

echo linking...
gcc $1.o -o$1 -L./lib -Wl,--start-group -lhbcommon -lhbvm -lhbrtl -lhbrdd -lhbmacro -lhblang -lhbcpage -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbsix -lhbusrrdd -lhbct -lgtstd -lhbdebug -lgtcgi -lgtpca -lgttrm -lhbbmcdx -lhbbtree -lhbclipsm -lhbcplr -lhbextern -lhbgt -lhbhsx -lhbmisc -lhbmsql -lhbmzip -lhbnf -lhbnulrdd -lhbpcre -lhbrdd -lhbsqlit3 -lhbtip -lhbtpathy -lhbvpdf -lhbziparc -lhbzlib -lrddado -lxhb -Wl,--end-group

rm $1.c
rm $1.o

echo done!
./$1
Verhoven
 
Posts: 521
Joined: Sun Oct 09, 2005 7:23 pm

Next

Return to FiveLinux / FiveDroid (Android)

Who is online

Users browsing this forum: No registered users and 1 guest