我正在为C++存储库尝试使用CMake,但在尝试在没有大量额外CMake代码的情况下轻松地针对同一源代码树中的库构建应用程序时遇到了一些麻烦。
源树的布局基本如下:
ROOT
libs/
lib1/
lib2/
lib3/
apps/
app1/
app2/
app3/
这些库彼此独立,并且应用程序可以链接到一个或多个库。
目前,我有一个根CMakeLists.txt,它将每个应用程序和库作为一个子目录列出,这样,如果库发生了更改并重新构建了应用程序,那么库也是如此。这很好,CMake将它链接进来,而无需指定库所在的位置,但我看不到对include目录执行类似操作的方法。
有没有一种常见的方法来处理这个问题?我不希望每个应用程序的CMakeLists.txt都必须手动列出所需库的路径。
如果您不怕为每个应用程序提供比实际需要更多的头,您可以在INCLUDE_directories语句中列出所有lib目录,例如在添加所有应用程序子列表的CMakeListst.txt中。但并没有这样的管理"归属"的概念,包括内置的每个目标的文件夹。
这个问题很老了。它是在2012-07-18被问到的。我在这里添加一个答案,试图解释一些历史。警告:我可能搞错了,或者误解了历史。
当时,最新的未发布候选relase是CMake v2.8.8(发布于2012-04-18)。v2.8.8中已经存在INCLUDE_DIRECTORIES
目标属性,但还没有相应的INTERFACE_INCLUDE_DIRECTORIES
目标属性。它的target_link_libraries
文档没有说明目标自动添加它所依赖的目标的include目录。
在提出这个问题大约十个月后(2012-07-18),CMake v.2.8.11发布。它添加了带有INTERFACE|PUBLIC|PRIVATE
参数的target_include_directories
命令签名,并添加了INTERFACE_INCLUDE_DIRECTORIES
目标属性。
因此,您可以创建一个目标B,为其指定公共/接口包含目录,然后通过target_linK_libraries
使目标a依赖于它,然后a将自动添加/使用B的包含目录。这可以通过使链接为公共/接口来实现传递,也可以通过使链路为私有来实现不传递。
您可以在这里找到Kitware的软件版本列表,在这里可以找到文档修订列表。