为什么这会发生在cmake上

时间:2015-06-30 22:45:54

标签: c++ cmake

我正在开发一个c ++项目,我正在使用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。打开它使用vim然后:wq这就是我现在所做的所有make,我的项目正在成功构建,我不知道为什么会这样,有人可以告诉我为什么吗?

ps:添加了此活动的GIF,请查看以获得清晰的图片

(我正在处理的代码也是链接的,这个问题就在这个提交中“dd4452b45c733e0612bc5f3c632e9d1a08be8072”)

link to gif

link to code

1 个答案:

答案 0 :(得分:2)

cmake中的变量仅限于它们所在目录的范围及其子目录。

这样,在gamelib子目录中调用find_module()时,找不到该模块在主目录中使用。

传播包含目录依赖关系的首选方法是将它们添加到目标(在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的可执行文件中提及它们。