target_include_directories包括路径

时间:2017-03-30 20:01:46

标签: c++ cmake

说我的项目看起来像:

 Project (dir)
   -- CMakeLists.txt
   -- MyLib (dir)
     |-- CMakeLists.txt
     |-- MyLib.h
     |-- MyLib.cpp

   -- MyOtherLib (dir)
     |-- CMakeLists.txt
     |-- MyLib.h (note that this is exactly the same name as in MyLib above)
     |-- MyLib.cpp

如果在MyLib / CMakeLists.txt中,我这样做:

target_include_directories(MyLib PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>

然后target_link_librariesMyLib的所有内容都会包含“正确”,包括执行#include "MyLib.h"的路径。但是,如果另一个可执行文件MyExecutable依赖于使用target_link_libraries(MyExecutable MyLib MyOtherLib)的两个库,您希望能够指定哪个库与#include "MyLib/MyLib.h"#include "MyOtherLib/MyLib.h"一起使用。我认为这样做的唯一方法是使用:

target_include_directories(MyLib PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>

哪种方式可以打败target_include_directories的一个好处,因为它确实强烈地强制避免意外的标头依赖,因为你实际上不能包含你没有明确声称要使用的东西。

是否有其他方法可以获得此#include "MyLib/MyLib.h"行为?

1 个答案:

答案 0 :(得分:1)

您应该重新考虑目录树,如下所示:

Project (dir)
   -- CMakeLists.txt
   -- MyLib (dir)
     |-- CMakeLists.txt
     |-- src (dir)
         MyLib.cpp
     |-- include/MyLib (two dirs)
         MyLib.h

   -- MyOtherLib (dir)
     |-- CMakeLists.txt
     |-- src (dir)
         MyLib.cpp
     |-- include/MyOtherLib (two dirs)
         MyLib.h

通过这种方式,您可以避免包含../,即Project文件夹及其中的所有内容,这不是一个干净的方法,如果您将来添加其他文件/文件夹,可能会导致其他问题。 然后,您可以写入MyLib/CMakeLists.txt

target_include_directories(MyLib PUBLIC 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/include)

并在MyOtherLib/CMakeLists.txt

target_include_directories(MyOtherLib PUBLIC 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/include)

因此,您可以在任何链接 build-tree 中的库的程序中编写#include "MyLib/MyLib.h"#include "MyOtherLib/MyLib.h"

如果您还要区分 build-tree install-tree 之间的include目录,请查看target_include_directories documentation和有用的{{ 3}}