一般情况下,我们的项目各个子项目都在一个总的项目根目录下,但有的时候,我们需要使用外部的文件夹,怎么办呢? 
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. Hdu1342 Lotto 2017-01-18 17:12 44人阅读 评论(0) 收藏

    Lotto Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submiss ...

  2. delphi执行一个外部程序,当外部程序结束后,delphi程序立即响应

    //需要引用 ShellAPI 单元;procedure TForm1.Button1Click(Sender: TObject); var SEInfo: TShellExecuteInfo; Ex ...

  3. Python学习-33.Python中glob模块的一些参数

    glob模块中有一个叫glob的方法可以获取某个目录下的文件. import glob temp=glob.glob("E:\\Temp\\*.txt") print(temp) ...

  4. Sql查询两个时间段有重叠的记录

    这个问题看上去简单,但是想了很久,最后发现,自己的思路有点乱. 下面四条时间段都和最上面那个有重叠的关系,就是这么个意思. 这里是问题的答案: 2个时间: a_start, a_end b_start ...

  5. [ACM_动态规划] hdu1003 Max Sum [最大连续子串和]

    Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...

  6. 反射导出 Excel

    /// <summary> /// List 数据导出Excel /// </summary> /// <param name="list">数 ...

  7. Python:Selenium Chrome无弹窗+property/attribute/text

    我们在用Selenium写自动化程序时候,并不希望程序在实际运行过程中一直弹Chrome窗口,这个时候就需要让Chrome默默打开,自动读取数据,然后默默关闭掉就好. 以下是让chrome用无界面形式 ...

  8. C#计算机性能参数

    Process proc = Process.GetCurrentProcess(); //string info = "内存:" + (Environment.WorkingSe ...

  9. hdoj1373 Channel Allocation(极大团)

    题意是有若干个接收器,给出每个接收器的相邻接收器.相邻的接收器不能使用同一信号频道.问所需要的信号频道数. 求该无向图的极大团. #include<iostream> #include&l ...

  10. Flask从入门到精通之使用Flask-Migrate实现数据库迁移

    在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不 ...