当前位置:   article > 正文

cmake使用教(一)多目录下多个文件的构建_cmake构建多个文件

cmake构建多个文件

1.采用 out-of-source 外部构建多个目录多个文件

        这里的文件存储方式如下:

         

其中build是构建目录,即构建的结果和中间产物都在该目录下

include是包含目录

src是子函数的目录或是依赖文件的目录

main.cpp主函数

从上图的右边可以发现src里存在add.cpp和一个对应的cmakelists.txt文件,同时根目录下也存在一个cmakelists.txt文件

  1. main.cpp
  2. #include<iostream>
  3. #include"include/add.h"
  4. using namespace std;
  5. int main()
  6. {
  7. cout<<" hello world"<<endl;
  8. int a = 3;
  9. int b = 5;
  10. cout<<" 3 + 5 = "<<add(a,b)<<endl;
  11. return 0;
  12. }
  13. #########################################
  14. add.cpp
  15. #include"add.h"
  16. int add(int& a, int& b)
  17. {
  18. return a+b;
  19. }

     上面的代码就是两个源文件的代码,很简单,主函数调用另个一文件的子函数add完成运算和输出,下面看看如何使用cmake进行构建

根目录下的CMakeLists.txt

  1. # 多个目录多个源文件
  2. cmake_minimum_required(VERSION 2.8)
  3. project(test1)
  4. # 遍历当前目录的所有文件并使用DIR_SRCS保存,也可以通过SET(SRC_LIST main.c)进行指定
  5. aux_source_directory(. DIR_SRCS)
  6. # 添加生成可执行文件的保存目录,不会保存中间产物,如果不指定该目录则和中间产物保存在一起
  7. set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin )
  8. # 添加头文件
  9. include_directories(${PROJECT_SOURCE_DIR}/include)
  10. # 这里将子目录条件到工程,并指定编译的输出产物,默认输出产物保存到build/src文件夹下,
  11. # 如果不指定可行文件保存路径同样也会保存到该路径下
  12. add_subdirectory(src)
  13. # 上面定义了将src子目录加入工程,并指定编译输出(包含编译中间结果)路径为
  14. # bin目录。如果不进行 bin目录的指定,那么编译结果(包括中间结果)都将存放在
  15. # build/src 目录(这个目录跟原有的src目录对应),指定 bin 目录后,相当于在编译时
  16. # 将src重命名为bin,所有的中间结果和目标二进制都将存放在bin目录。
  17. # 指定生成目标
  18. add_executable(test1 main.cpp)
  19. # 添加链接库
  20. # 把子目录集src的编译成的库文件链接到这里
  21. target_link_libraries(test1 add)
  22. message(STATUS ${PROJECT_SOURCE_DIR} "------完成编译和链接生成可执行文件-----")

上面的作用都进行了详细的解释,这里需要强调的是几个命令:

set指令的语法是:
set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只需要了解SET指令可以用来显式的定义变量即可。
比如我们用到的是SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:
set(SRC_LIST main.c t1.c t2.c)。

message指令的语法是:
message([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS — ,输出前缀为 的信息。

FATAL_ERROR,立即终止所有cmake 过程.
我们在这里使用的是STATUS 信息输出,演示了由PROJECT 指令定义的两个隐式变量
HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存
放的位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除,比如,工程
的example,可能就需要工程构建完成后,再进入 example目录单独进行构建(当然,你
也可以通过定义依赖来解决此类问题)。
上面的例子定义了将src子目录加入工程,并指定编译输出(包含编译中间结果)路径为
bin目录。如果不进行 bin目录的指定,那么编译结果(包括中间结果)都将存放在
build/src 目录(这个目录跟原有的src目录对应),指定 bin 目录后,相当于在编译时
将src重命名为bin,所有的中间结果和目标二进制都将存放在bin目录。

src目录下的CMakeLists.txt

  1. # 查找当前目录下的所有源文件,并将名称保存到 DIR_LIB_SRCS 变量
  2. aux_source_directory(. DIR_LIB_SRCS)
  3. # 添加目录
  4. include_directories(../include)
  5. # 这里是设置保存库文件的路径的,不保存中间产物,库文件最后保存在build/lib中
  6. set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
  7. # 生成链接库
  8. add_library(add ${DIR_LIB_SRCS})
  9. message(STATUS "----------生成静态库完成----------" ${PROJECT_SOURCE_DIR}/add)

最后编译结果为:

进入build目录在linux目录行键入:cmake  ..   然后make

 构建后,在build中会创建bin目录和lib目录还有对应的src,观察后会发现,src是中间产物,最终的可执行文件在bin文件夹下,src生成的库文件在lib文件夹下,大家多尝试修改,就明白了。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号