如何在CMake中明确指定树外源?

时间:2016-02-07 23:35:30

标签: c++ cmake

我查看了这篇文章:Using CMake to statically link to a library outside of the project。但是我仍然无法解释这意味着什么:

add_subdirectory(/path/to/the/library/source/directory subproject/grzeslib)

我假设“/ path / to / the / library / source / directory”表示来自硬盘的路径,但我不明白“subproject / grzeslib”的含义。 现在我试过了:

include_directories(../path/to/dir)
add_subdirectory (../path/to/dir .) 

但我得到了一个精心的警告。有更好的方法吗?

2 个答案:

答案 0 :(得分:14)

第二个参数是该子目录中目标结果的输出目录。

从此处的文档:https://cmake.org/cmake/help/v3.3/command/add_subdirectory.html

  

<强> add_subdirectory

     

将一个子目录添加到构建中。

add_subdirectory(source_dir [binary_dir]
             [EXCLUDE_FROM_ALL])
     

向构建添加子目录。

     
      
  • source_dir指定源CMakeLists.txt和代码文件所在的目录。如果它是相对路径呢   将针对当前目录进行评估(典型的   用法),但也可能是绝对路径。
  •   
  • binary_dir指定放置输出文件的目录。如果是相对路径,则将对其进行评估   当前输出目录,但它也可能是绝对路径。如果   在扩展之前,未指定binary_dir,即source_dir的值   将使用任何相对路径(典型用法)。
  •   
  • 在当前输入中处理之前,CMake将立即处理指定源目录中的CMakeLists.txt文件   文件继续超出此命令。
  •   
  • 如果提供了EXCLUDE_FROM_ALL参数,则子目录中的目标将不会包含在父目录的ALL目标中   目录默认情况下,将从IDE项目文件中排除。   用户必须在子目录中显式构建目标。这意味着   当子目录包含项目的单独部分时使用   这是有用但不必要的,例如一组例子。通常   子目录应包含自己的project()命令调用   这样就可以在子目录中生成完整的构建系统   (例如VS IDE解决方案文件)。请注意目标间依赖关系   取代这种排斥。如果由父项目构建的目标   依赖于子目录中的目标,依赖目标将是   包含在父项目构建系统中以满足依赖性。
  •   

答案 1 :(得分:2)

来自documentation

  

向构建添加子目录。 source_dir指定   源CMakeLists.txt和代码文件所在的目录   位于。如果是相对路径,则将对其进行评估   当前目录(典型用法),但也可能是   绝对路径。 binary_dir指定要在其中的目录   放置输出文件。如果它是相对路径,则将对其进行评估   关于当前输出目录,但它也可能是一个   绝对路径。如果未指定binary_dir,则为   在扩展任何相对路径之前,将使用source_dir(   典型用法)。指定源中的CMakeLists.txt文件   目录将在处理之前由CMake立即处理   当前输入文件继续超出此命令

从您的示例中,在&#34; / path / to / the / library / source / directory&#34;中创建的所有二进制文件;将被放置在&#34; subproject / grzeslib&#34;中,保持&#34;清洁&#34;是一件好事。来源dirs。