cmake项目中include_directories命令的必要性

时间:2018-02-24 09:56:49

标签: makefile cmake

我正在学习关于CMake的教程,我在理解使用' include_directories'的必要性时遇到了问题。命令一点。

让我先解释一下这个项目:

在我的工作目录中,我有: - main.cpp函数,CMakeLists.txt(主要函数),配置文件,数学函数'目录和' build'目录

在MathFunction目录中,我有: - 将由主要文件调用的CMakeLists.txt文件 - 一个文件' mysqrt.cxx'包含将在' main.cpp'中使用的函数的实现。应用 - A' MathFunctions.h'包含该函数原型的头文件

来自' MathFunction'的CMakeLists目录我使用来自' mysqrt.cxx'的代码创建了一个库。像这样:

add_library(MathFunctions mysqrt.cxx)

此代码段是我的主要CMake代码的一部分:

# add the MathFunctions library?
#
if (USE_MYMATH)
 include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") # WHY DO WE NEED THIS
 add_subdirectory (MathFunctions)
 set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

add_executable(Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)

现在我不明白为什么我需要添加' include_directories'命令为了使用库?不应该是最后一个命令' target_link_libraries'链接已创建的可执行文件和库togheter所以不需要include_directories?

感谢您阅读,如果我没有解释得很好,我很抱歉,但我希望您能理解我的意思:D

1 个答案:

答案 0 :(得分:0)

命令include_directories设置要搜索的标题文件.h)的目录。 链接target_link_libraries)与库基本上只指定库文件.so.dll或其他类型)。如您所见,这些不同的东西

当将可执行文件与库目标链接时,CMake将该库目标的某些属性传播(更确切地说,"消耗")到可执行文件。在这些属性中有INTERFACE_INCLUDE_DIRECTORIES属性,它在可执行文件中添加了包含目录。

因此,当库目标正确设置了 INTERFACE_INCLUDE_DIRECTORIES 属性时,您不需要显式指定可执行文件的包含目录:

<强> MathFunctions /的CMakeLists.txt

add_library(MathFunctions mysqrt.cxx)
# Among other things, this call sets INTERFACE_INCLUDE_DIRECTORIES property.
target_include_directories(MathFunctions PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

<强> CMakeLsits.txt

add_executable(Tutorial tutorial.cxx)
# This also propagates include directories from the library to executable
target_link_libraries (Tutorial MathFunctions)

注意,使用简单的

# This *doesn't* set INTERFACE_INCLUDE_DIRECTORIES property.
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
MathFunctions/CMakeLists.txt中的

并不意味着将目录传播到链接的可执行文件。