一般情况下,我们的项目各个子项目都在一个总的项目根目录下,但有的时候,我们需要使用外部的文件夹,怎么办呢? 
add_subdirectory命令,可以将指定的文件夹加到build任务列表中。下面是将与当前项目平级的一个目录下的子目录用add_subdirectory命令加进来的CMakelists.txt脚本片段 :

#定义CASSDK位置
if(NOT CASSDK_DIR)
set( CASSDK_DIR ${CMAKE_SOURCE_DIR}/../cassdk)
endif()
if( IS_DIRECTORY ${CASSDK_DIR} )
add_subdirectory( ${CASSDK_DIR}/cassdk )
else()
message(FATAL_ERROR "INVALID FOLDER 'CASSDK_DIR'=${CASSDK_DIR}" )
endif()

然后执行CMakeList.txt脚本时报错了:

CMake Error at CMakeLists.txt:35 (add_subdirectory): 
add_subdirectory not given a binary directory but the given source 
directory “J:/workspace/cassdk/cassdk” is not a subdirectory of 
“J:/workspace/codemgr”. When specifying an out-of-tree source a binary 
directory must be explicitly specified.

报错原因也很明确,因为要添加的这个文件夹不是当前项目的子目录。最后一句指明了方向:要指定一个外部的文件夹必须显式指定。 
但怎么显式指定? 
下面是add_subdirectory命令的官方说明:

原来add_subdirectory还有一个 binary_dir参数(一般这个参数用不到,所以从来没关注过),这个参数用来指定source_dir在输出文件夹中的位置,如果没有指定的时候,就用source_dir的值。 
如果要添加外部文件夹,binary_dir就必须指定。所以上面的代码修改如下:

#定义CASSDK位置
if(NOT CASSDK_DIR)
set( CASSDK_DIR ${CMAKE_SOURCE_DIR}/../cassdk)
endif()
if( IS_DIRECTORY ${CASSDK_DIR} )
# 第二个cassdk.out参数用于指定外部文件夹在输出文件夹中的位置
add_subdirectory( ${CASSDK_DIR}/cassdk cassdk.out)
else()
message(FATAL_ERROR "INVALID FOLDER 'CASSDK_DIR'=${CASSDK_DIR}" )
endif()

再执行CMakeList.txt正常通过,下图红框标出就是cassdk子目录下CMakeLists.txt的执行输出。 

然后你可以发现在输出文件夹下多出一个名为cassdk.out的文件夹,就是第二个参数指定的值。 

cmake:用add_subdirectory()添加外部项目文件夹的更多相关文章

  1. CMake 添加头文件目录,链接动态、静态库(添加子文件夹)

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  2. Android程序入口以及项目文件夹的含义和使用总结—入门

    新接触一门程序或者开发框架,我一般都要先弄清楚程序的入口在哪里,程序怎么运行的:建立一个项目后,各个文件夹有什么作用以及如何使用等等.理清楚这些东西对以后开发是很有好处的,古话说得好,工欲善其事,必先 ...

  3. Qt 添加外部库文件(四种方法)

    Qt添加外部库文件, 一种就是直接加库文件的绝对路劲,这种方法简单,但是遇到多个库文件的时候,会很麻烦,而且,如果工程移动位置以后还需要重新配置 另一种就是相对路径了,不过Qt 编译的文件会在一个单独 ...

  4. linux共享文件samba安装与java读取外部文件夹方法

    测试环境RedHat 6.4 一.安装 samba组件安装: (1)首先用“rpm –qa |grep samba”命令检验系统samba服务是否安装. #rpm –qa |grep samba sa ...

  5. MyEclipse2016添加外部的maven插件

    1.在maven官网下载最新的maven安装包,下载地址:http://maven.apache.org/download.cgi: 2.目前maven的版本是3.5.0,我们下载apache-mav ...

  6. asp.net -mvc框架复习(2)-创建ASP.NET MVC 第一个程序以及MVC项目文件夹说明

    建议vs2013或2013以上版本的vs,要是跨平台的话最好用vs2015或vs2017的asp.net mvc core . 1.创建ASP.NET MVC 第一个程序 打开vs2013->文 ...

  7. Eclipse导入项目文件夹

    Eclipse项目导入出现感叹号解决方法 出现这样的情况怎么办 右击项目名-Bulid path -configure Bulid path 选择Libraries-Remove(移去错的)-Add ...

  8. 本地项目文件夹上传至个人Github

    安装Git 之后到Git官网,点击Download下载,打开安装包一路按Next一切默认直至安装结束. 找到任意一个文件夹,点击鼠标右键后若出现下图的 Git Gui Here 和 Git Bash ...

  9. VSCode打开多个项目文件夹的解决方法

    最近从sublime转vscode,自然而然就会把sublime的一些习惯带过来,其中有一点让人头疼的是: 当把一个文件夹拖进vscode里面的时候,会把原来的文件夹覆盖掉,这就意味着不能同时在vsc ...

随机推荐

  1. PAT甲 1048. Find Coins (25) 2016-09-09 23:15 29人阅读 评论(0) 收藏

    1048. Find Coins (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva loves t ...

  2. MyEclipse2014中Java类右键Run as没有JUnit Test

    Java初学,想试试连接本地数据库,按照百度经验中的方法,在最后执行测试的卡住了,为啥?因为MyEclipse中右键Run as没有JUnit Test选项! 6.1.测试数据库mysql是在项目中连 ...

  3. TCP/IP模型的一个简单解释

    TCP/IP模型是互联网的基础. 想要理解互联网,就必须理解这个模型.但是,它不好懂,我就从来没有搞懂过. 前几天,BetterExplained上有一篇文章,很通俗地解释了这个模型.我读后有一种恍然 ...

  4. Android 权限的由来

    在Android APP开发过程中,某些行为动作需要在AndroidManifest.xml清单文件中进行权限相关的配置: <!-- 增加权限 --> <uses-permissio ...

  5. Android Sqlite 简单SQL语句

    --- 创建表 create table student(_id integer primary key autoincrement, name text); --- 查询全部 select _id, ...

  6. Microsoft SQL Server 2012 管理 (1): 安装配置SQL Server 重点

    SQL Server 可以在实例,数据库,列,查询分别指定排序规则 /* Module 1 - working with Clollations */ -- 1.1 Obtain the Instan ...

  7. C++ 补遗

    C++通过引用传递数组 数组形参可以声明为数组的引用.如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身. 在这种情况下,数组大小成为形参和实参类型的一部分(实参长度与形参长 ...

  8. 微软研发流程(ALM)管理培训会议(比亚迪汽车)

    主要讨论和演示整体研发流程,包括需求管理.项目计划.开发管理.生成和发布.测试管理等. Figure 1 - 客户现场培训 Figure 2 - 客户现场培训 Figure 3 - 客户现场培训

  9. NET 下载共享文件

    执行 public static void Run() { "); if (state) { // 共享文件夹的目录 TransportRemoteToLocal(@"\\192. ...

  10. [C#学习笔记]lock锁的解释与用法

    写在前面 前几时在写业务代码的时候,看到有用到lock这个方法的,而我竟然并不知道是做什么用的,所以查找了许多博客文章,弄懂了百分之七八十,在此做下笔记. 感谢博客 http://www.cnblog ...