说我的项目看起来像:
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_libraries
到MyLib
的所有内容都会包含“正确”,包括执行#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"
行为?
答案 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}}