[CMake] cmake入门: 调用多个目录下的源文件

CMake入门

举例一:

假设工程HelloWorld文件结构如下:
-main.cpp
-MyClass/
–MyClass.h
–MyClass.cpp
在main.cpp中include<MyClass.h>

方法一 在根目录下的CMakeLists.txt内容为:
cmake_minimum_required(VERSION 3.12)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)  
# 包含进目录 MyClass/  
include_directories("${PROJECT_SOURCE_DIR}"/MyClass)  
# 使用指定文件生成可执行文件 HelloWorld  
add_executable(HelloWorld main.cpp MyClass/MyClass.h MyClass.cpp)  

该方法为直接使用全部的资源文件生层可执行文件

方法二 在根目录下的CMakeLists.txt为:
cmake_minimum_required(VERSION 3.15)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
# 搜集指定目录 ../MyClass 下的源文件,将输出结果列表储存到变量ALL_SOURCE中
aux_source_directory(. ALL_SOURCE)
aux_source_directory(${PROJECT_SOURCE_DIR}/MyClass ALL_SOURCE)
# 包含进目录 MyClass/
include_directories("${PROJECT_SOURCE_DIR}/MyClass")
# 使用指定文件生成可执行文件 HelloWorld
add_executable(HelloWorld ${ALL_SOURCE})

该方法同为直接使用全部的资源文件,但是这次使用aux_source_directory()命令自动收集参数目录下的全部源文件到变量中,在这个例子中看起来似乎比方法一复杂,但是对于目录下有很多源文件的情况比方法一简单。

方法三 在MyClass/和根目录下分别建立CMakeLists.txt文件:

根目录下的CMakeLists.txt为:

cmake_minimum_required(VERSION 3.15)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
# 添加子目录 MyClass/ 并且也会处理 MyClass目录下的 CMakeLists.txt文件
add_subdirectory(MyClass)
# 包含进目录 MyClass/
include_directories("${PROJECT_SOURCE_DIR}/MyClass")
# 生成可执行文件 HelloWorld
add_executable(HelloWorld main.cpp)
# 将可执行文件添加链接库 MyClass
target_link_libraries(HelloWorld MyClass)

MyClass/目录下CMakeLists.txt为:

cmake_minimum_required(VERSION 3.15)
set(CMAKE_CXX_STANDARD 14)
#搜集MyClass目录下的文件
aux_source_directory(. MYCLASS_SOURCE)
#生成链接库
add_library(MyClass ${MYCLASS_SOURCE})

该方法将MyClass目录下的源文件生成一个静态链接库,在生成可执行文件之后将可执行文件与链接库文件链接起来运行。比方法一、二更合理(我觉得)。


举例二:

假设工程HelloWorld文件结构如下:
-main.cpp
-MyClass/
–MyClass.h
–MyClass.cpp
-MyFunction/
–MyFunction.h
–MyFunction.cpp
在main.cpp中 #include<MyFunction.h>
在MyFunction.cpp中 #include<MyClass.h>

方法一 在根目录下、MyClass目录和MyFunction目录下都新建CMakeLists.txt文件

根目录下CMakeLists.txt为:

cmake_minimum_required(VERSION 3.15)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
#添加子目录 MyClass/ 并且也会处理 MyClass目录下的 CMakeLists.txt文件
add_subdirectory(MyClass)
add_subdirectory(MyFunction)
#生成可执行文件 HelloWorld
add_executable(HelloWorld main.cpp)
#将可执行文件添加链接库MyFunction
target_link_libraries(HelloWorld MyFunction)
#将目录MyFunction添加到HelloWorld目标路径中
target_include_directories(HelloWorld PUBLIC MyFunction)

在MyClass目录下的CMakeLists.txt文件为:

cmake_minimum_required(VERSION 3.15)
set(CMAKE_CXX_STANDARD 14)
#搜集MyClass目录下的文件
aux_source_directory(. MYCLASS_SOURCE)
#生成链接库
add_library(MyClass ${MYCLASS_SOURCE})

在MyFunction目录下的CMakeLists.txt文件为:

 cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 14)
#生成链接库
add_library(MyFunction MyFunction.h MyFunction.cpp)
#目标链接库MyFunction添加链接库MyClass
target_link_libraries(MyFunction MyClass)
#将目录MyClass添加的目标目录中
target_include_directories(MyFunction PUBLIC ../MyClass)

同时另外提一点,根目录下的CMakeLists.txt文件中的命令include_directories()是用来将目录MyClass/添加到编译器搜索包含文件的路径列表中,这样在main.cpp文件中可以使用#include<MyClass.h>。如果没有include_directoris()命令,必须在main.c中使用#include<MyClass/MyClass.h>包含头文件。

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用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文件中定义相应的规则和依赖关系。这样做可以使整个项目的构建更加清晰和灵活。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值