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.

Config.cmake para un paquete de biblioteca.

Equipamos un paquete de biblioteca con un archivo *Config.cmake, siguiendo el paso 11 del tutorial de CMake. Sin embargo, nuestro software aguas abajo no puede encontrar la biblioteca.

Nuestro paquete se llama “formfactor” [https://jugit.fz-juelich.de/mlz/libformfactor]. Proporciona una biblioteca compartida (libformfactor) y algunos archivos de encabezado.

Nuestro código aguas abajo usa
“`find_package(formfactor REQUIRED CONFIG)
message(STATUS "formfactor: found=${formfactor_FOUND}, include_dirs=${formfactor_INCLUDE_DIR}, "
"lib=${formfactor_LIBRARY}, version=${formfactor_VERSION}")

<pre><code>para buscar la biblioteca. Desafortunadamente, imprime
“`formfactor: found=1, include_dirs=/usr/local/include, lib=, version=0.1

Es decir, no encuentra la biblioteca, pero no genera un error fatal aunque dijimos “REQUIRED”.

El paquete “formfactor” contiene lo siguiente:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
project(formfactor VERSION 0.1.1 LANGUAGES CXX)

if(NOT DEFINED BUILD_SHARED_LIBS)
    option(BUILD_SHARED_LIBS "Build as shared library" ON)
endif()
option(WERROR "Treat warnings as errors" OFF)

add_subdirectory(ff)

install(EXPORT formfactorTargets
  FILE formfactorTargets.cmake
  DESTINATION cmake
)

include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
    "${CMAKE_CURRENT_BINARY_DIR}/formfactorConfig.cmake"
    INSTALL_DESTINATION cmake
    NO_SET_AND_CHECK_MACRO
    NO_CHECK_REQUIRED_COMPONENTS_MACRO
    )

write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/formfactorConfigVersion.cmake"
    VERSION "${formfactor_VERSION_MAJOR}.${formfactor_VERSION_MINOR}"
    COMPATIBILITY AnyNewerVersion
    )

install(FILES
    ${PROJECT_BINARY_DIR}/formfactorConfig.cmake
    ${PROJECT_BINARY_DIR}/formfactorConfigVersion.cmake
    DESTINATION cmake)

export(EXPORT formfactorTargets
  FILE ${CMAKE_CURRENT_BINARY_DIR}/formfactorTargets.cmake
)

Config.cmake.in:
“`@PACKAGE_INIT@

set(formfactor_INCLUDE_DIR @CMAKE_INSTALL_PREFIX@/include)
include(${CMAKE_CURRENT_LIST_DIR}/formfactorTargets.cmake)

<pre><code><br />**ff/CMakeLists.txt:**
</code></pre>

set(lib formfactor)
set(${lib}_LIBRARY ${lib} PARENT_SCOPE)

file(GLOB src_files *.cpp)
set(api_files Polyhedron.h PolyhedralTopology.h PolyhedralComponents.h)

add_library(${lib} ${src_files})

target_include_directories(${lib}
PUBLIC
$<build_interface:${cmake_source_dir}>
$<install_interface:include>
)

set_target_properties(
${lib} PROPERTIES
OUTPUT_NAME ${lib}
VERSION ${formfactor_VERSION}
SOVERSION ${formfactor_VERSION_MAJOR})

install(
TARGETS ${lib}
EXPORT formfactorTargets
LIBRARY DESTINATION lib
RUNTIME DESTINATION lib
ARCHIVE DESTINATION lib)

install(
FILES ${api_files}
DESTINATION include/ff)
“`

¿Hay algo mal? ¿Algo falta? ¿Por qué no funciona de otra manera?

Divulgación:
– Publicación cruzada desde https://discourse.cmake.org/t/find-package-config-mode-wont-find-library/4573.
– He visto la discusión relacionada https://stackoverflow.com/questions/39103110. Aquí estoy interesado en una solución que haga toda la generación automática de archivos recomendada en el tutorial de CMake.</build_interface:${cmake_source_dir}>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece ser que el nombre de la biblioteca (libformfactor) no está especificado en el archivo Config.cmake.in. Actualizar ese archivo para incluir el nombre de la biblioteca debería solucionar el problema. Aquí está el Config.cmake.in actualizado:

    @PACKAGE_INIT@
    
    set(formfactor_INCLUDE_DIR @CMAKE_INSTALL_PREFIX@/include)
    set(formfactor_LIBRARY @formfactor_LIBRARY@)
    
    include(${CMAKE_CURRENT_LIST_DIR}/formfactorTargets.cmake)
    

    Tenga en cuenta la adición de set(formfactor_LIBRARY @formfactor_LIBRARY@) para establecer el nombre de la biblioteca. Esto debería garantizar que el código descendente pueda encontrar la biblioteca.

    Además, asegúrese de que formfactorTargets.cmake se genere correctamente actualizando el comando install(EXPORT ...) en CMakeLists.txt a:

    install(EXPORT formfactorTargets
      NAMESPACE formfactor::
      FILE formfactorTargets.cmake
      DESTINATION cmake/formfactor
    )
    

    Esto garantiza que los objetivos están correctamente nombrados y hace que el comando descendente find_package funcione como se espera.

Comments are closed.