2009-07-22 19 views
44

Estoy construyendo un sistema de compilación basado en cmake para nuestro producto. El problema es que el proyecto de Visual Studio, generado por cmake, no muestra los archivos de encabezado en el navegador de soluciones.Listado de archivos de encabezado en el proyecto Visual Studio C++ generado por cmake

¿Qué necesito agregar en CMakeList.txt para listar los archivos de encabezado? La solución preferida es donde no es necesario listar cada archivo de encabezado particular.

Solución Aquí es una solución Vine con:

file(GLOB_RECURSE INCS "*.h") 
add_library(myLib ${SRCS} ${INCS}) 

Gracias

+5

Como beneficio adicional que puede hacer source_group (cabeceras ARCHIVOS $ {} CEIN) para mostrarlos en una carpeta separada VS –

Respuesta

34

Sólo tiene que añadir los archivos de cabecera, junto con los archivos de origen:

PROJECT (Test) 

ADD_EXECUTABLE(Test test.cpp test.h) 

o el uso de variables:

PROJECT (Test) 

SET(SOURCE 
    test.cpp 
) 

SET(HEADERS 
    test.h 
) 

ADD_EXECUTABLE(Test ${SOURCE} ${HEADERS}) 
+6

OMI la cosa todas estas respuestas te (con la excepción de @Simeon) es que Don 't desea enumerar explícitamente todos los archivos de encabezado, porque: 1. Los encabezados enumerados como dependencias explícitas pueden derivar fácilmente fuera de sincronización con los que realmente está utilizando en el origen y 2. CMake ya sabe qué cabeceras uso, por lo que es redundante ingresarlos manualmente también. Entonces realmente necesitamos una respuesta que tome el conocimiento propio de CMakes de las dependencias del encabezado, y las pegue en un grupo para la solución. –

+0

@JeffTrull: en realidad CMake no sabe qué encabezados usa: funciona con múltiples idiomas y múltiples compiladores, y no puede confiar en los compiladores que informan los encabezados. Entonces, debemos enumerarlos explícitamente. También es más limpio para hacer distribuciones de código fuente. –

+1

Aprecio que la característica del escáner de dependencia solo funcione para algunos idiomas ... pero funciona para C++, y sería genial tener este conocimiento que CMake ya posee disponible para los usuarios de Visual Studio. Si no es así, al menos tenga algún tipo de gancho para que podamos escribirlo nosotros mismos en el código CMake (a través de source_group). Una lista explícita de dependencias definitivamente se quedará obsoleta a lo largo del tiempo, ya que la compilación seguirá funcionando aunque sea incorrecta. Además, es redundante ... –

18

El truco básico para esto es agregar los archivos de encabezado a uno de los objetivos (ya sea ejecutable o biblioteca). Esto es particularmente irritante porque cmake ya conoce todas las dependencias del archivo de encabezado y debería ocuparse de esto por nosotros. Puede organizar aún más mediante el comando source_group:

source_group("My Headers" FILES ${MY_HDRS}) 

Tenga en cuenta que usted tiene que hacer lo mismo en Xcode también.

9

Tuve el mismo problema mientras trabajaba en un sistema de compilación para un proyecto de Qt y salí con esta solución, gracias a las otras publicaciones en esta página. Incluí un ejemplo completo adaptado de mis makefiles. ¡Espero que esto ayude!

cmake_minimum_required (VERSION 2.6) 
project (DemoSolution) 

find_package(Qt4 REQUIRED) 
include(${QT_USE_FILE}) 
add_definitions(${QT_DEFINITIONS}) 

include_directories (../../include/) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 

file(GLOB Demo_SOURCES *.cpp) 
file(GLOB Demo_HEADERS *.hpp) 
file(GLOB Demo_FORMS *.ui) 
file(GLOB Demo_RESOURCES resources.qrc) 

qt4_wrap_cpp(Demo_MOC ${Demo_HEADERS}) 
qt4_wrap_ui(Demo_FORMS_HEADERS ${Demo_FORMS}) 
qt4_add_resources(Demo_RESOURCES_RCC ${Demo_RESOURCES}) 

source_group("Headers" FILES ${Demo_HEADERS}) 
source_group("MOC" FILES ${Demo_MOC}) 

set(QT_USE_QTNETWORK, true) 
set(QT_USE_QTSQL, true) 
set(QT_USE_QTXML, true) 

add_library(Demo SHARED 
    ${Demo_SOURCES} 
    ${Demo_HEADERS} 
    ${Demo_MOC} 
    ${Demo_FORMS_HEADERS} 
    ${Demo_RESOURCES_RCC} 
    ) 

target_link_libraries(Demo ${QT_LIBRARIES}) 
add_definitions(-D_DEMO_EXPORTS) 
+4

No es buena forma de hacer globbing. http://stackoverflow.com/questions/1027247/best-way-to-specify-sourcefiles-in-cmake. De la documentación de cmake: No se recomienda usar GLOB a para recopilar una lista de archivos fuente de su árbol fuente. Si no hay CMakeLists.El archivo txt cambia cuando se agrega o elimina una fuente, el sistema de compilación generado no puede saber cuándo solicitar la regeneración de CMake. – Vitali

Cuestiones relacionadas