2015-06-30 8 views
0

Я работаю над проектом C++, и я использую cmake в качестве системы сборки, поэтому мой рабочий процесс здесь вносит изменения в код. затем,Почему это происходит с cmake

rm -r build 
mkdir build 
cd build 
cmake -G "Unix Makefiles" .. 
make 

Теперь я добавил GLEW как зависимость от проекта, поэтому каждый раз, когда я пытаюсь запустить make я получаю сообщение об ошибке сказав SDL.h not found(this was working before) .После когда-нибудь я решил проверить CMakeCache.txt .opened его с помощью vim затем :wq это все Я сделал это, если я запустил make, мой проект успешно строится, я не уверен, почему это происходит. Может ли кто-нибудь сказать мне, почему?

пс: добавил GIF этого события, проверить его, чтобы получить четкую картину

(код я работаю над связан, как хорошо, это точный вопрос в этой фиксации «dd4452b45c733e0612bc5f3c632e9d1a08be8072»)

link to gif

link to code

+1

Каталог 'build' обычно не должен находиться в том же каталоге, что и CMakeLists.txt. Также почему вы каждый раз удаляете каталог сборки? – WorldSEnder

+0

ОК, поэтому я создал каталог сборки в другом месте, все еще те же результаты. Что касается «почему я удаляю каталог сборки каждый раз ..» (я действительно не знаю, это просто делает меня безопасным и счастливым :)) @WorldSEnder – bindingofisaac

+0

Каталог сборки содержит кэшированные скомпилированные объектные файлы, вы вынуждаете компилятор регенерировать их каждый запуск, даже если вы не изменили ничего в некоторых из них, что сильно ударит вас, когда у вас будут большие проекты. – WorldSEnder

ответ

2

переменные в CMake ограничены объем каталога, в котором они находятся, плюс их подкаталоги.

Это, вызывая find_module() в подкаталоге gamelib, не находит этот модуль для использования в основном каталоге.

Предпочтительный способ для распространения включает в зависимости каталога является добавление их к цели (в каталоге gamelib), как это:

target_include_directories(gamelib BEFORE PRIVATE 
$<BUILD_INTERFACE:${SDL2_INCLUDE_DIR}> 
$<BUILD_INTERFACE:${GLEW_INCLUDE_DIR}> 
) 

target_include_directories(gamelib SYSTEM BEFORE PUBLIC 
$<BUILD_INTERFACE:${SDL2_INCLUDE_DIR}> 
$<BUILD_INTERFACE:${GLEW_INCLUDE_DIR}> 
) 

, то вам не нужно даже упоминать о них в любом исполняемом использует gamelib.

+0

вы говорите, что вызов find_module() в подкаталоге gelelib не добавляет их в основной каталог, это нормально, потому что я создаю подкаталог gelibib в статической библиотеке, а затем привязываю его к цели главной директории, но проблема заключается в том, что include каталоги и синтаксис, который вы давали для распространения, включают в себя dirs из верхнего уровня в подкаталоги, в настоящее время не ясен, я буду читать и пытаться поместить его в свой код и сообщить вам, если он работает :). – bindingofisaac

+0

@bindingofisaac документация в cmake на эту тему (и многое другое) не сразу понятна, но как только вы поймете концепцию, она изменит вашу жизнь (к лучшему !!). Основная идея заключается в том, что каждая цель несет с собой всю свою информацию о зависимости, в разных формах, ссылается ли она на другой проект в дереве сборки или используется ли она в качестве установленной библиотеки (см. Команду export).Happy reading :) –

+0

спасибо, что это работает отлично, теперь я пытаюсь понять [документация] (http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html) – bindingofisaac

Смежные вопросы