Не собирается проект в CMake при смене порядка включения субдеррикторий в CMakeLists

433
01 сентября 2017, 23:34

Имеется основной CMakelists

ADD_SUBDIRECTORY(my_math_lib)
ADD_SUBDIRECTORY(parse_stream_lib)
ADD_SUBDIRECTORY(calculator)

и симейк листы субдеррикторий:

my_math_lib:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9)
PROJECT(my_math)
INCLUDE_DIRECTORIES(include/my_math)
SET(HEADER_FILES
    include/my_math/my_math.h)
SET(SOURCE_FILES
    src/my_math.cpp)
ADD_LIBRARY(my_math STATIC ${SOURCE_FILES} ${HEADER_FILES})
SET(${PROJECT_NAME}_INCLUDE_DIRS
    ${PROJECT_SOURCE_DIR}/include
    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)

parse_stream_lib:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9)
PROJECT(parse_stream)
INCLUDE_DIRECTORIES(${my_math_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(include/parse_stream)
SET(HEADER_FILES
    include/parse_stream/parse_stream.h)
SET(SOURCE_FILES
    src/parse_stream.cpp)
ADD_LIBRARY(parse_stream STATIC ${SOURCE_FILES} ${HEADER_FILES})
SET(${PROJECT_NAME}_INCLUDE_DIRS
    ${PROJECT_SOURCE_DIR}/include
    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
ADD_DEPENDENCIES(parse_stream my_math)
TARGET_LINK_LIBRARIES(parse_stream my_math)

calculator:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9)
PROJECT(calculator)
INCLUDE_DIRECTORIES(${parse_stream_INCLUDE_DIRS})
SET(HEADER_FILES)
SET(SOURCE_FILES
    src/calculator_main.cpp)
ADD_EXECUTABLE(calculator ${SOURCE_FILES} ${HEADER_FILES})
ADD_DEPENDENCIES(calculator parse_stream)
TARGET_LINK_LIBRARIES(calculator parse_stream)

calculator зависит от parse_stream, a parse_stream зависит от my_math.

Проект собирается и все работает, но как только я изменю порядок субдеррикторий в основном CMakeLists например сделаю :

ADD_SUBDIRECTORY(parse_stream_lib)
ADD_SUBDIRECTORY(my_math_lib) 
ADD_SUBDIRECTORY(calculator)

то проект уже не собирается т.к. parse_stream не видит my_math.

Как исправить данную проблему? т.к. при большом проекте будет сложно и займет много времени выстраивать порядок субдирректорий по порядку их зависимостей

Answer 1

Проблему помогла решить статья https://habrahabr.ru/post/330902/ А именно 4 совет, который говорит что нужно использовать target_include_directories вместо include_directories для добавления путей поиска заголовков, от которых зависит цель.

И проект начинает собираться нормально независимо от порядкя субдеррикторий. Так же в этой статье в 4 совете имеется ссылка на хорошую презентацию о современном использовании CMake, которая будет полезна для дальнейшей работы с CMake.

READ ALSO
С++ Как добавить программу в автозагрузку без прав администратора

С++ Как добавить программу в автозагрузку без прав администратора

Написал я маленькую программу, которая в свою очередь запускает другую программуИ мне нужно добавить первую программу в автозагрузу желательно...

459
Программа не запускается без dll

Программа не запускается без dll

Написал программу на c++В ней есть функции: запуск программы, добавление записи в реестр, цикл и пара функций, а также несколько поключенных...

425
Положение дочернего окна

Положение дочернего окна

Какая функция вернет положение управляющего элемента RECT{50,30,300,80}?

350
Некорректная работа методов hide и show.

Некорректная работа методов hide и show.

При отработке ajax-запроса странно работают методы hide и showНа долю секунды блоки, которые должны исчезать, еще висят и только потом с 'дерганием'...

314