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

5 篇文章 0 订阅
4 篇文章 0 订阅

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

  • 37
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在使用CMake时,如果需要添加多个目录并同时编译,可以按照以下步骤进行操作。 首先,在主目录CMakeLists.txt文件中使用add_subdirectory命令来添加各个子目录。例如,假设我们有两个子目录分别为"subdir1"和"subdir2",我们可以在主目录CMakeLists.txt中添加以下代码: ``` add_subdirectory(subdir1) add_subdirectory(subdir2) ``` 然后,在各个子目录中的CMakeLists.txt文件中设置该子目录编译规则和依赖。例如,在"subdir1"的CMakeLists.txt中,我们可以使用add_library或add_executable命令来定义库或可执行文件,并指定需要编译的源文件或依赖的其他库。类似地,在"subdir2"的CMakeLists.txt中也可以定义相应的规则和依赖。 最后,在主目录CMakeLists.txt中使用target_link_libraries命令来指定各个目标之间的依赖关系。例如,如果"subdir2"中的目标依赖于"subdir1"中的目标,我们可以在主目录CMakeLists.txt中添加以下代码: ``` target_link_libraries(target_in_subdir2 target_in_subdir1) ``` 这样,当我们使用CMake生成项目时,各个子目录中的CMakeLists.txt文件将被自动调用,它们的目标将会被编译,并且指定的依赖关系也会被处理。 总结起来,要在CMake中添加引用多个目录并同时编译,我们需要在主目录CMakeLists.txt文件中添加每个子目录的路径,并在各个子目录CMakeLists.txt文件中定义相应的规则和依赖关系。这样做可以使整个项目的构建更加清晰和灵活。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值