2011-07-31 19 views
52

Tengo un CMakeLists.txt en mi raíz de proyecto y uno en mi carpeta/src. El que está en la carpeta/src solo contiene una variable con los archivos .cpp (set (SOURCEFILES main.cpp foo.cpp)) y en la raíz CMakeLists.txt hago add_subdirectory(src) y luego hago add_executable(MyApp ${SOURCEFILES}).cmake variable scope, add_subdirectory

Pero cmake me da el error

add_executable llamada con un número incorrecto de argumentos, no hay fuentes proporcionados

¿Cómo llego cmake para ver la variable? He leído que cmake sólo conoce las variables globales, pero eso no es obviamente el caso ...

Respuesta

78

Como se menciona en la documentación del comando set, cada directorio añadió con add_subdirectory o cada función declarada con function crea un nuevo ámbito.

El nuevo ámbito secundario hereda todas las definiciones de variables de su ámbito primario. Las asignaciones de variables en el nuevo ámbito hijo con el comando set solo estarán visibles en el ámbito hijo a menos que se use la opción PARENT_SCOPE.

Para realizar la asignación SOURCEFILES visible en la carpeta raíz de su proyecto, trate de:

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
+2

Gracias, esto lo resolvió. Pero otra nota: en el subdirectorio, ahora debe utilizar '$ {CMAKE_CURRENT_SOURCE_DIR}/foo.cpp' en lugar de solo' foo.cpp' porque cmake ahora está en el ámbito principal. – blubberbernd

+2

Como alternativa, puede establecer la variable en el archivo padre CMakeLists.txt antes de la llamada add_subdirectory, y hacer que su definición herede el archivo childCakeLists. De nuevo, deberá calificar los nombres de los archivos si necesita consultarlos desde múltiples archivos CMakeLists. – DLRdave

+5

Tendrá que crear la variable también en el ámbito actual para usar sus valores en el subdirectorio/función: 'set (valor VAR PARENT_SCOPE); set (VAR $ {VAR}); ' –