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
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.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()
.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()
.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.