大型工程会有很多文件,包括类的实现和定义,各种不同的模块交叉在一起,我们怎么用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静态库+链接程序了。