CMAKE学习——编译多个文件 & 多个目录

大型工程会有很多文件,包括类的实现和定义,各种不同的模块交叉在一起,我们怎么用cmake方便的编译呢?

例如有这么一个工程:

我们现在想要编译的话,如果只选择了main.cpp,则会提示”未定义的引用“,因为我们头文件和实现分离,但我们只包含了头文件,所以是一定找不到实现的。我们这时候就要把所有源文件都添加到add_executable中:

保存以后使用cmake .  &  make  就可以完成一次perfect的编译过程了。

但是问题又来了,假如我们的工程很大,需要很多个CPP文件,总不能一个一个添加吧,对于这种情况 ,cmake提供了一个能够自动获取当前目录下所有CPP的函数:

 aux_source_directory(目录  存放文件列表的变量)

例如我们想搜索当前目录下的所有cpp则为

aux_source_directory(. CPP_LIST)

但是这个命令只会仅仅搜索当前目录下的文件(即tool2.cpp),tool1目录中无法搜索到,有两种解决办法:

1:再增加一个aux_source_directory(./tool1 CPP_LIST2),即可成功编译

2.使用cmake单独将tool1文件夹编译为一个so

具体步骤:

1.在tool1文件夹中新建一个CMakeLists.txt ,其中内容为:

aux_source_directory(. tool1_file) #查找当前目录下的tool1相关文件

add_library(tool1lib ${tool1_file})   #将他们编译为一个叫tool1lib的文件

2.主目录的cmakelists修改为:

cmake_minimum_required(VERSION 2.6)  #指定cmake最低版本为2.6

project(FirstCmakeDemo)  #指定工程名称
aux_source_directory(. CPP_LIST)  #搜索当前目录下的所有cpp文件
add_subdirectory(tool1)           #将tool1文件夹加入子目录,这样他就可以去tool1文件夹中查找编译

add_executable(out_file ${CPP_LIST}) #生成目标文件

target_link_libraries(out_file tool1lib)
#添加链接库,其库的名字由tool1文件夹中的CMakeLists.txt来指定生成

写好保存以后,在根目录运行cmake .  & make,即可自动编译.a静态库+链接程序了。


版权声明:本文为dyyzlzc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。