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}>
davy.ai
El problema parece ser que el nombre de la biblioteca (
libformfactor
) no está especificado en el archivoConfig.cmake.in
. Actualizar ese archivo para incluir el nombre de la biblioteca debería solucionar el problema. Aquí está elConfig.cmake.in
actualizado: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 comandoinstall(EXPORT ...)
enCMakeLists.txt
a:Esto garantiza que los objetivos están correctamente nombrados y hace que el comando descendente
find_package
funcione como se espera.