[Jderobot-dev] Problema al compilar Server.cpp

Mikel González m.gonzalezbai en gmail.com
Mie Feb 27 00:36:37 CET 2013


Hola Jaime,

veo que tienes un pequeño lío con el uso de CMake, lo cual es normal, es 
una herramienta muy potente pero hace falta práctica para domesticarla ;-).

Como diría JM, aquí van mis dos centavos para que entiendas un poco 
mejor esta herramienta, aunque te sugiero que le eches un vistazo a su 
manual [1] donde te quedará todo más claro.

El proceso de generación de un binario está dividido en dos etapas, por 
una parte la compilación y por otra el enlazado. Para la compilación es 
necesaria definir dónde se encuentran las cabeceras (.h) donde están los 
símbolos que utilizas en tus ficheros fuentes, con CMake ésto se define 
utilizando:

include_directories()

Según veo en tu sintaxis de tu CMakeLists.txt, has mezclado directorios 
donde realmente se encuentran este tipo de ficheros:

/usr/local/include/jderobot

con directorios donde se encuentran librerías, y no cabeceras:

/usr/local/lib

mientras que el donde se encuentran las librerías forma parte del 
enlazado y se indica de la siguiente manera:

link_directories()

Por último y para terminar el proceso (a parte de definir el ejecutable) 
es necesario especificar de cuales librerías hace uso tu aplicación, 
para ello tenemos:

TARGET_LINK_LIBRARIES()

Resumiendo, especificamos dónde están las cabeceras, dónde están las 
librerías y qué librerías son necesarias.

Si tratamos de seguir un patrón para todos los ficheros CMakeLists.txt 
podemos dividir su definición en varias etapas:

1) Definir los ficheros fuentes que conforman tu aplicación:

> SET( SOURCE_FILES  Printer.cpp Server.cpp)
Bien hecho.

2) Definir los directorios donde se encuentran las cabeceras incluídas 
en tu aplicación. Puesto que tu aplicación hace uso de ICE, es necesario 
especificar donde se encuentran las cabeceras de estas librerías. Para 
facilitar la tarea de futuros programadores, añadí en el repositorio un 
directorio llamado "Deps/" que incluye una carpeta, "ice", donde se 
establecen de forma óptima todas las rutas en las que se encuentra ICE 
en tu sistema, tanto cabeceras como librerías. De tal forma que el 
código necesario para hacer uso de ICE es:

SET 
<http://www.cmake.org/cmake/help/cmake2.6docs.html#command:set>(DEPS_DIR#Directorio 
donde se encuentra la carpeta Deps)
include 
<http://www.cmake.org/cmake/help/cmake2.6docs.html#command:include>(${DEPS_DIR}/ice/CMakeLists.txt)

Al igual ocurre con gearbox, OpenCV y otras dependencias que puedes 
encontrar ya resueltas en ese directorio.

Para aquellas cabeceras que no están ya definidas en el directorio 
"Deps/", debes incluir la ruta de donde se encuentran haciendo uso, como 
ya he citado, de la sentencia:

include_directories(
     /usr/local/include
     /usr/local/include/jderobot
     #etc, etc
     )

3) Definir donde se encuentran las librerías de las que vas a hacer uso. 
En este caso ocurre como en el punto 2), si has hecho uso del directorio 
Deps/ para alguna dependencia no será necesario especificar nada, si por 
el contrario debes especificarlo a mano:

link_directories(
     /usr/local/lib
     /usr/local/lib/jderobot
     # etc, etc
)

4) Definir el ejecutable a partir de los ficheros fuentes fijados en el 
paso 1):

> add_executable (server  ${SOURCE_FILES})

5) Especificar las librerías de las que vas a hacer uso. Nuevamente, si 
has hecho uso del directorio Deps/, las librerías de ICE quedan 
almacenadas en una variable (ZeroCIce_LIBRARIES), con lo que simplemente 
hará falta incluir esta variable en la sentencia 
"TARGET_LINK_LIBRARIES". Te dejo un ejemplo de como especificar que tu 
ejecutable hace uso de ICE y de otra librería que hay que especificar 
manualmente:

TARGET_LINK_LIBRARIES(
     /usr/local/lib/jderobot/libcolorspacesmm.so # Añadida manualmente
     ${ZeroCIce_LIBRARIES} # Añadida haciendo uso de la variable
)

Bueno, espero que mi sermón te sirva de ayuda para entender un poco 
mejor la herramienta CMake y te ayude en tus futuras compilaciones :-).

Un saludo.

Mikel.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20130227/1914e885/attachment-0001.htm 


More information about the Jde-developers mailing list