Как target_include_directories понимает, какой заголовочный файл нужно использовать? Почему не нужно явно указывать имя заголовочного файла?

Рейтинг: 0Ответов: 1Опубликовано: 03.07.2023

У меня есть такой каталог

C:.
│   CMakeLists.txt
│   main.cpp
│
├───include
│       dog.h
│       log.h
│       operations.h
│
└───src
        dog.cpp
        log.cpp
        operations.cpp

Я хочу создать статическую библиотеку operations.lib. Для этого у меня есть такой CmakeList.txt

cmake_minimum_required(VERSION 3.5)

project (HelloApp 
        VERSION 0.0.1
        DESCRIPTION "The leading Hello World App"
        LANGUAGES CXX)



# static library creation
add_library(operations STATIC src/operations.cpp)

# вот тут возникает вопрос: как Cmake узнает, что в папке include нужен именно файл 
# operations.h
target_include_directories(operations PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

target_compile_features(operations PUBLIC cxx_std_20)
# static library creation

add_executable(HelloAppBinary main.cpp 
        src/dog.cpp
        src/log.cpp)



        message("The path is:" ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(HelloAppBinary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_features(HelloAppBinary PUBLIC cxx_std_20)
target_link_libraries(HelloAppBinary PUBLIC operations)

Статическая библиотека генерируется, с этим всё в порядке.

Вопрос в следующем: как Cmake узнает, что для создания библиотеки ему нужно заинклудить именно operations.h, а не оставшиеся заголовочные файлы (dog.h,log.h)? Мои догадка, что он это делает по прототипу функции (которая становится ему известной из-за тела фукнции в operations.cpp) , так ли это? Это ли является причиной, почему не нужно явно указывать имя заголовочного файла (operations.h)?

Ответы

▲ 2Принят

как Cmake узнает, что для создания библиотеки ему нужно заинклудить именно operations.h

Никак не узнает. Ему неважно, какие конкретно хедеры соотвествуют статической библиотеке.

target_include_directories( ... PUBLIC ... ) делает две вещи:

  • При сборке самой библиотеки, добавляет эту папку в список путей, в которых компилятор ищет инклуды. (Вероятно флагом -I, если это GCC.)

  • То же самое делает при сборке того, что зависит от этой библиотеки.

И там и там CMake-у достаточно знать только папку, а не конкретные хедеры в ней.