PDA

Ver la versión completa : Hecho un lio creando proyecto C en linux con librerias propietarias



crossmax
14/07/2010, 21:44
Buenas a todos!

Estoy intentando desarrollar sobre una placa mini especifica sobre una debian y en c/c++ y ando muy perdido a la hora de configurar las librerias que el fabricante facilita para poder ponerme a hacer alguna cosa sencillita. De hecho, entre las librerias hay algunos ejemplos para probar el funcionamiento, pero no consigo saber que hacer con todo eso para ejecutar los ejemplos... un pelin de paciencia conmigo ... :lamer:
Os cuento un poco paso a paso lo que hago y en donde me quedo enganchado:
1- Descargo de la web de la placa unos fuentes para probar los distintos puertos de la placa (I2C, SPI, ADC...)
2- Dice: For Linux, type "make -f Make.LINUX" ... lo compilo sin problemas y me crea en el directorio archivos .o y uno .a
3- Veo que hay una carpeta "examples" con codigo .cpp y .h. En un cpp veo que hay un main por lo que intento compilar ese con: g++ -o demo DemoBoard.cpp
4- Me saltan unos cientos de errores del tipo: error: ‘mem_alloc’ was not declared in this scope
demofile.cpp:830: warning: deprecated conversion from string constant to ‘char*’
5- Dado el exito, intento crearme mi main, incluyendo los .h. No hay forma, también saltan errores
Entonces, ¿como puedo ejecutar los ejemplos y de que forma importo las librerias que supongo son el .a y el .o??

Tambien lo he intentado para una minipci donde me dan los fuentes y donde compilo con un makefile que trae. Por su carpeta veo una /lib con: un .c, un .h un .so y otro makefile . En este caso los ejemplos (no traen extension) puedo ejecutarlos en consola y me funcionan. ¿Que debo de incluir en mi proyecto para importar las librerias?

Siento el tocho, y espero no parecer muuu tonto, pero agradeceria mucho vuestra ayuda

Saludos!!

GameMaster
14/07/2010, 22:27
Si el makefile te ha generado los objetos entonces es porque te faltan referencias a las libs.
Abre el makefile y mira a ver si las rutas que pone las tienes, con las respectivas dependencias.

Aiken
14/07/2010, 22:31
pues en el g++ -o demo DemoBoard.cpp necesitas añadir dos cosas, el include path para que sepa donde encontrar las librerias, y las librerias que quieres que enlace.

basicamente algo como
g++ -o demo DemoBoard.cpp -I<carpeta donde esten los .h> -L<carpeta donde estan los .a> -l<lalibreria>

si la el archivo se llama libcomomolo.a pues es -lcomomolo en el ultimo parametro que te he puesto en el ejemplo.


Aiken

< - >

Si el makefile te ha generado los objetos entonces es

el makefile le ha generado .o y .a, vamos la libreria que es lo unico que le tiene que generar nada mas.

ahora solo tiene que linkarla con su main.
Aiken

juanvvc
14/07/2010, 22:46
basicamente algo como
g++ -o demo DemoBoard.cpp -I<carpeta donde esten los .h> -L<carpeta donde estan los .a> -static -l<lalibreria>

Perdona por la corrección :) Si el Makefile generó archivos .a, se tienen que linkar estáticamente :)

crossmax
15/07/2010, 09:42
Lo pruebo esta tarde y os cuento, que ahora no tengo la susodicha.

Muchisimas gracias por la ayuda!!


Edit---

Parece que mi main compila!!! Gracias los comentarios, ahora solo me tengo que pelear con las funciones de las librerias...

Muchas gracias, de verdad, habeis sido de gran ayuda.
Que por cierto, al final he usado el -l con static, aunque tambien compila sin él [wei]

crossmax
17/08/2010, 13:38
Buenas!!
Ya esta el pesado de turno otra vez. A ver si me podeis echar una manita. Es casi lo mismo que lo que os comentaba, pero en este caso en lugar de instalar la libreria desde un Makefile que proporciona el fabricante es una libreria de xml instalada por defecto en el linux.
He visto que la libreria en cuestion está en /usr/lib/libxml2.a (tambien está con .so). Yo le indico ese path con -L y la libreria con -lxml2 pero el compilador dice que no la encuentra.

Al no haber compilado yo esa libreria (por defecto viene ya en linux) tengo que añadirla a mi proyecto de alguna manera especial??

No sé si mi problema es que no sé como utilizar las funciones de la libreria en mis .c y despues añadir la libreria en el gcc. Yo incluyo los .h que tengo de xml2 con comillas ya que si lo hago con <> me peta porque no encuentra las funciones. COn comillas me peta la compilacion porque no encuentra la libreria xml2.

Me podeis ayudar?? Mil gracias
#include <libxml2.h> o #include "libxml2.h"

juanvvc
17/08/2010, 14:16
El -L es solo en el linkado, y no tienes que pasarle -L/usr/lib/libxml2.a sino solo el directorio -L/usr/lib

Pero durante la compilación tienes que decirle dónde están los .h, por eso no te los encuentra con <>. Si no le dices dónde buscar solo buscará en el directorio actual, que es lo que hace el #include "". Para que funcione en #include <> tienes que usar la opción -I (eso es una i mayúscula) Probablemente esté en /usr/include, así que -I/usr/include

De todas formas creo que compilas en el PC un programa para una mini placa diferente, ¿no? En ese caso ten en cuenta que no puedes linkar a las librerías del PC sino a las de la placa. O bien compila las librerías libxml2 para la placa, o bien utiliza un SDK que ya las incluya (y pones en las opciones -L y -I los directorios del SDK, claro)

crossmax
18/08/2010, 14:22
El -L es solo en el linkado, y no tienes que pasarle -L/usr/lib/libxml2.a sino solo el directorio -L/usr/lib

Pero durante la compilación tienes que decirle dónde están los .h, por eso no te los encuentra con <>. Si no le dices dónde buscar solo buscará en el directorio actual, que es lo que hace el #include "". Para que funcione en #include <> tienes que usar la opción -I (eso es una i mayúscula) Probablemente esté en /usr/include, así que -I/usr/include

De todas formas creo que compilas en el PC un programa para una mini placa diferente, ¿no? En ese caso ten en cuenta que no puedes linkar a las librerías del PC sino a las de la placa. O bien compila las librerías libxml2 para la placa, o bien utiliza un SDK que ya las incluya (y pones en las opciones -L y -I los directorios del SDK, claro)

¿Y si me dedico a otra cosa??? :loco: Cada dia me planteo si esto es lo mio!!! :mad:
Menos mal que tengo alguna ayudita extra como la tuya, Juan, muchas gracias.

Te voy a hacer unas preguntillas, a ver si me puedes resolver mis rayadas.
Ahora estoy intentando utilizar xml en una placa arm9, de la que tengo un kit de desarrollo que funciona sobre una distribucion linux que provee el propio fabricante, con un eclipse modificado para hacer el desarrollo (uboot, kernel, aplicaciones...)
¿Como consigo instalar las librerias xml2 en la plaquita?
Creo que me estoy liando en la compilacion cruzada. Ahora tengo configurado que el u-boot me pille la imagen de mi pc por tftp pero si intento compilar con el eclipse añadiendo las rutas a las librerias me dice que no son compatibles. Debe de ser porque les paso las del propio pc (x86) y necesita las de arm. ¿¿Donde tendré esas librerias en arm o como compilo el codigo fuente de la libxml2 desde el eclipse???
Con un ssh a la plaquita no puedo porque logicamente no tengo ni un triste compilador.

Espero me puedas guiar, una vez mas. Muchas gracias

juanvvc
18/08/2010, 14:34
No te estás liando, lo has entendido perfectamente: necesitas las librerías libxml2 de ARM, necesitas configurar tus entornos para que cojan las librerías de ARM y no las de PC, y necesitas que esas librerías estén instaladas en la placa para poder ejecutar tus programas.

Cómo se hace eso para tu placa, ahí ya sí que no sé :( No sé cómo se configura eclipse para compilar nada, porque nunca lo he usado, ni sé dónde podrás encontrar las librerías libxml2 ya compiladas. Una vez consigas compilarlas probablemente tengas que añadirlas a esa imagen que envías desde tu PC por TFTP, aunque tampoco sé cómo :(

crossmax
03/09/2010, 13:56
Al final conseguí compilar las librerias en mi PC pasandole unos parametros especificos, como que era un ARM y despues copié la libreria a un directorio que se exporta a la placa ARM por lo que ya tenia mi libreria disponible. Muchas gracias!!!! Aunque los ocnceptos parece que los voy teniendo claros, siempre me surgen nuevas dudas.
A ver si en esta tambien me puedes guiar un poco.
Si yo quiero en mi aplicacion reservar una zona de memoria a bajo nivel para que despues sea utilizada por un dispositivo externo a la placa como puedo hacerlo?? Seria como añadir un driver a mi proyecto. He visto como se reserva memoria en el driver de una UART, queria hacer algo parecido e inclurlo en mi main, ya que realmente no hay ningun driver para lo que necesito. No acabo de entender si para acceder a distinto hardware necesito hacer algo en el kernel, o puedo acceder directamente desde mi aplicacion.
Logicamente he añadido esa parte de codigo que me interesa pero no consigo compilar, ya que por mas que incluyo .h me siguen saltando errores.

Espero me puedas aclarar un pelin mis ideas, una vez mas, y que no sea yo el que te esté liando a ti.

Un saludo