C¿Diferencia entre include_directories y add_subdirectory?

3 minutos de lectura

avatar de usuario
yodafan86

Estoy aprendiendo CMake para compilar código C++ y tengo problemas con el siguiente concepto. En mi directorio de nivel raíz, tengo algunos archivos cpp y un CMakeLists.txt que genera con éxito algún código de ahorro en un directorio gen-cpp. Mi nivel raíz CMakeLists.txt contiene:

include_directories(“ruta-a-la-raíz”/gen-cpp). (junto con la generación automática de ahorro relevante e incluye.

Todo se compila correctamente, pero obtengo errores vinculados a la biblioteca dinámica en tiempo de ejecución para un símbolo indefinido que hace referencia a una clase definida en el directorio gen-cpp. Cuando muevo los archivos en el directorio al nivel raíz, funciona bien. ¿Qué me estoy perdiendo? (También ajusté #include en los directorios cpp de nivel raíz para señalar “ruta a raíz”/gen-cpp).

¿Es esto un malentendido sobre el uso de include_directory, donde debería estar usando add_subdirectory? Si es lo último, ¿necesitaría el código en gen-cpp su propio CMakeLists.txt? ¿Por qué no se necesita este archivo adicional, cuando el contenido de dicho directorio es de nivel raíz?

avatar de usuario
jie yin

add_subdirectory(source_dir): Se usa para agregar un subdirectorio a la compilación. También hay un archivo CMakeLists.txt en source_dir. Este archivo CMakeLists.txt en el directorio de origen especificado será procesado inmediatamente por CMake antes de que el procesamiento en el archivo de entrada actual continúe más allá de este comando.

include_directories(dir): agregue los directorios dados a los que usa el compilador para buscar archivos de inclusión. Estos directorios se agregan a la propiedad de directorio INCLUDE_DIRECTORIES para el archivo CMakeLists actual.

avatar de usuario
con flecha

los include_directories() se utiliza para agregar rutas de búsqueda de encabezados (-I bandera) y add_subdirectory() no hará ninguna diferencia en este caso.

Supongo que debe enumerar los archivos * .cpp de la carpeta gen-cpp en add_executable() o add_library() llamadas, en las que deseas que estén estos símbolos.

Alternativamente, puede compilar todas las fuentes de ahorro en la biblioteca y vincularlas con su código.

  • Para profundizar en su último punto, parece que sería la forma ideal de lidiar con esto, ¿hay algún ejemplo del uso de una macro de CMake utilizada para generar automáticamente/compilar/vincular código de ahorro que alguien pueda indicarme?

    – yodafan86

    7 oct 2012 a las 22:23

  • Creo que todavía no estoy explicando mi problema correctamente, creo que radica en mi comprensión general de Cmake, no específicamente en el ahorro. El problema genérico tiene una estructura de directorio de nivel superior que contiene CMakeLists.txt, algunos archivos .cpp/.h y un directorio que contiene archivos .cpp/.h adicionales que los del directorio de nivel superior #incluyen — que ¿Qué comandos debo mirar en el nivel raíz CMakeLists.txt para compilar/vincular correctamente los archivos en el directorio interno? ¿También necesitaría un CMakeLists.txt adicional en el directorio interno, si es así, que contiene qué?

    – yodafan86

    7 oct 2012 a las 22:53


  • No, no lo necesitas. Simplemente enumere estos archivos en la llamada add_*(): add_executable(myexe file1.cpp folder/file2.cpp).

    – flecha

    8 de octubre de 2012 a las 5:42


  • En cuyo caso, include_directories es lo mismo que add_subdirectory, en cuyo caso es diferente. si alguien pudiera tener un ejemplo.

    – usuario454083

    21 de mayo de 2015 a las 14:12

¿Ha sido útil esta solución?