usar tag quimica que poner hacer ejemplos cursiva como cmake header-only

tag - CMake: biblioteca de solo encabezado con archivos generados



que es tags h1 y cursiva (3)

Tengo una biblioteca que necesita cargar algunos datos constantes inyectados a partir del contenido de archivos que no son de origen (en este caso, código de sombreado de OpenGL). Para lograr esto, estoy usando add_custom_command() para generar archivos de inclusión que puedo #include en mi código para inicializar las variables estáticas const.

Esto funciona perfectamente con bibliotecas regulares (estáticas o compartidas), pero ahora me gustaría hacer que mi biblioteca sea solo de encabezado. La capacidad de C ++ para permitir que los métodos estáticos devuelvan datos estáticos sin correr el riesgo de tener esos datos duplicados en cada unidad de traducción ("estática mágica") lo hace posible.

Sin embargo, el problema es que CMake parece suponer que una biblioteca INTERFACE (que es la característica CMake que estoy utilizando para crear bibliotecas de solo encabezado) no necesita compilación, lo que, en este caso, es incorrecto.

(Me doy cuenta de que no existe una obligación real para que mi biblioteca sea solo de encabezado. En este caso particular, la razón por la que deseo esto es que me gustaría que la biblioteca, que está haciendo OpenGL, permanezca independiente de cualquier biblioteca de enlace específica [ como GLEW o GLee o el glbinding recién glbinding ]. Al mantener mi biblioteca solo como encabezado, puedo dejar esa opción al usuario; todo lo que tiene que hacer es #include el encabezado de la biblioteca de enlace antes que el mío.)

¿Alguien ve la manera de hacer que CMake active los comandos personalizados de generación de encabezados, a más tardar cuando se está construyendo el proyecto del consumidor?

EDITAR: Me acabo de dar cuenta de que podría tener "lo mejor de ambos mundos" manteniendo mi biblioteca estática pero manteniendo todo mi código a excepción de los datos constantes en los archivos de encabezado. De esta forma, aún no habría necesidad de elegir una biblioteca de enlace de OpenGL específica. Sin embargo, todavía hay ventajas de que una biblioteca sea solo encabezada, simplicidad de uso para una, así que dejo mi pregunta abierta.

EDIT # 2: Aquí está la parte relevante de mi archivo CMakeLists.txt (solo CMakeLists.txt las dependencias de la biblioteca, todas solo del encabezado, desde el final):

set(SHADER_FILES "src/vertex.glsl" "src/fragment.glsl") add_library(libGPCGUIGLRenderer INTERFACE) target_sources(libGPCGUIGLRenderer INTERFACE ${SHADER_FILES}) target_include_directories(libGPCGUIGLRenderer BEFORE INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) # Embed shader files source_group("Shader files" FILES ${SHADER_FILES}) set(GENERATED "${CMAKE_CURRENT_BINARY_DIR}/generated") target_include_directories(libGPCGUIGLRenderer INTERFACE ${GENERATED}) # Find the GPC Bin2C utility find_package(GPCBin2C REQUIRED) # Add a custom target and a dependency for each shader file foreach(shader ${SHADER_FILES}) get_filename_component(name "${shader}" NAME) set(shader_header "${GENERATED}/${name}.h") add_custom_command( OUTPUT ${shader_header} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${shader} COMMAND GPCBin2C --input=${CMAKE_CURRENT_SOURCE_DIR}/${shader} --output=${shader_header} ) target_sources(libGPCGUIGLRenderer INTERFACE ${shader_header}) endforeach()


Crear una biblioteca estática con encabezados como las únicas fuentes trabajadas para mí. Es, por supuesto, solo una solución alternativa.

  • La creación de una biblioteca estática con solo archivos de encabezado da como resultado una biblioteca vacía. ¡Mine dice !<arch> como el único contenido.
  • CMake obtendrá automáticamente las dependencias correctas en todos los subdirectorios.
  • Dado que todas las fuentes son encabezados, debe indicar a CMake qué lenguaje de enlazador debe usarse.

Código:

set(OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/generated_include") add_custom_command( OUTPUT "${OUTDIR}/outfile.h" # Replace the next two lines with a proper generating script. COMMAND mkdir -p ${OUTDIR} COMMAND touch ${OUTDIR}/outfile.h ) # Note, I am only adding header files to the library. add_library(generated-headers STATIC "${OUTDIR}/outfile.h" ) set_target_properties(generated-headers PROPERTIES LINKER_LANGUAGE CXX) target_include_directories(generated-headers PUBLIC ${OUTDIR})

Use en otros directorios como este:

# In any other directory of the same CMake project: add_executable(main main.cpp) target_link_libraries(main generated-headers)

Probado en CMake 3.2, 3.8 y 3.9. Usando Ninja y Make generators.


Me encontré con problemas similares cuando trato de usar contenta: https://github.com/Dav1dde/glad

Utiliza un comando CMake personalizado para crear un enlace, lo que significa que los archivos que necesita incluir en el proyecto que usa glad no existen, de modo que CMake no crea contento (lo que crearía esos archivos) ...

No pude probarlo todavía, pero el ejemplo 3 del siguiente enlace parece ser una buena solución y creo que puede funcionar en su caso: https://samthursfield.wordpress.com/2015/11/21/cmake- dependencias-entre-objetivos-y-archivos-y-comandos-personalizados /