我正在学习关于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
答案 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
中的并不意味着将目录传播到链接的可执行文件。