es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Construir una biblioteca estática y un archivo C en el archivo CMakeLists de C++.

Espero que alguien pueda ayudar.

Tengo una estructura como sigue:

Top_dir
--> CmakeLists.txt
--> include
----> defs.h (accede a las funciones en la librería estática)
----> moredefs.h (accede a las funciones en la librería estática)
----> myClass.h (archivo de encabezado de mi clase - incluye defs.h y moredefs.h)

--> lib
----> src
------> functions.c (autogenerado - incluye defs.h y moredefs.h)
----> libsomelib.a (me dieron esto con un compilador para hacer los encabezados autogenerados)

--> src
----> main.cpp
----> myClass.cpp

Mi archivo CMakeLists está causando problemas: no sé cómo compilar para incluir libsomelib.a y el archivo .c en una biblioteca y agregarla al ejecutable principal.

project(miProyecto)
set(NOMBRE_MODULO ${PROJECT_NAME})
set(NOMBRE_LIBRERIA ${NOMBRE_MODULO})

#####  CONFIGURACIÓN

find_package(catkin REQUIRED COMPONENTS
  roscpp
)

set(MAIN
  src/main.cpp
)

set(SOURCES
  src/myClass.cpp
)

set(HEADERS
  include/myClass.h
  include/defs.h
  include/moredefs.h
)

###### LIBRERÍA

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_library(${NOMBRE_LIBRERIA}
  ${SOURCES}
  ${HEADERS}
)

add_library(myAttemptLib
  lib/src/functions.c
)

add_library(myAttemptLib STATIC IMPORTED)

set_target_properties(myAttemptLib PROPERTIES IMPORTED_LOCATION lib/libsomelib.a)

target_link_libraries(${NOMBRE_LIBRERIA}
  ${catkin_LIBRARIES}
)

###### EJECUTABLE

add_executable(${PROJECT_NAME}_node ${MAIN})

add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(${PROJECT_NAME}_node
  ${NOMBRE_LIBRERIA}
  ${catkin_LIBRARIES}
  myAttemptLib
)

Esto se compila y se ejecuta. Puedo agregar y usar tipos de datos de los encabezados sin problema, se compilará y el código se ejecutará, pero tan pronto como intento utilizar una función que se encuentra dentro de libsomelib.a, obtengo el error de compilación “referencia indefinida a la función” y “receta para el objetivo falló”.

En un archivo Makefile en una pequeña área de prueba puedo compilar y crear un ejecutable que se ejecuta de forma independiente.

Siento que hay alguna forma en la que debería compilar el .a + .c con el ejecutable principal, pero he buscado mucho y no he encontrado una solución, por lo que estoy recurriendo a esta comunidad.

Espero que alguien pueda ayudar.

Saludos,

Steve

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para compilar una biblioteca estática con CMakeLists.txt

    Si tienes problemas para compilar una biblioteca estática en CMakeLists.txt, hay ciertos pasos que puedes seguir para resolver el problema. Aquí tienes algunos pasos que puedes seguir:

    1. Encontrar el paquete de la biblioteca

    El primer paso es encontrar el paquete de la biblioteca que ofrece la función a la que estás intentando acceder. Una vez que localices el paquete, es esencial incluir la ruta al paquete en la sección include_directories() de tu archivo CMakeLists.txt.

    include_directories(
      include
      ${catkin_INCLUDE_DIRS}
      /ruta/a/mibiblioteca
    )
    

    2. Crear el objetivo de la biblioteca estática

    Después de ubicar el paquete e incluir la ruta, crea un objetivo para la biblioteca estática utilizando el comando add_library().

    add_library(miBiblioteca STATIC IMPORTED)
    set_target_properties(miBiblioteca PROPERTIES IMPORTED_LOCATION /ruta/a/mibiblioteca/libsomelib.a)
    

    3. Enlazar la biblioteca estática

    Una vez que se haya creado el objetivo para la biblioteca estática, enlázalo con el ejecutable utilizando target_link_libraries().

    target_link_libraries(${PROJECT_NAME}_node
      ${LIB_NAME}
      ${catkin_LIBRARIES}
      miBiblioteca
    )
    

    Con estos tres pasos, deberías poder compilar la biblioteca estática con tu archivo CMakeLists.txt. Si la función sigue mostrando un error de referencia indefinida, intenta verificar si el paquete está instalado correctamente y si la función está definida en la biblioteca.

Comments are closed.