cmake 构建多文件多目录项目教程
时间: 2023-06-05 07:47:26 浏览: 189
CMake是一个跨平台的构建工具,它可以自动生成各种不同的构建系统文件(Makefile、Visual Studio Solution等),这些构建系统可以用来编译、链接、测试、打包项目,并生成二进制文件。在本教程中,我们将展示如何使用CMake来构建一个多文件多目录项目。
步骤一:创建项目结构
我们将创建一个名为“myproject”的项目,该项目包含两个子目录“src”和“include”以及一些源文件。其中,“src”目录包含所有源代码文件,“include”目录包含项目的头文件。
beijing80s-macbook-pro:~/projects/myproject$ ls
CMakeLists.txt src include
beijing80s-macbook-pro:~/projects/myproject$ ls src/
source1.cpp source2.cpp
beijing80s-macbook-pro:~/projects/myproject$ ls include/
header1.hpp header2.hpp
步骤二:创建CMakeList.txt 文件
我们首先在项目的根目录下创建一个名为“CMakeLists.txt”的文件,并定义以下内容:
cmake_minimum_required(VERSION 3.1)
project(myproject)
add_subdirectory(src)
add_subdirectory(include)
在这个CMakeLists.txt 文件中,我们使用cmake_minimum_required设定最小CMake版本,而使用project定义项目名称。
接着,我们加入了“add_subdirectory(src)”和“add_subdirectory(include)”命令,这个命令告诉CMake去src及include目录下执行各自内部的CMakeLists.txt 文件。这样可以分别构建src和include目录中的代码。
步骤三:编写子目录CMakeLists.txt 文件
接着,我们需要分别编写src和include目录下的CMakeLists.txt 文件。
首先编写src目录下的CMakeLists.txt 文件,定义以下内容:
set(SOURCES
source1.cpp
source2.cpp
)
add_library(src STATIC ${SOURCES})
target_include_directories(src PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
在这个CMakeLists.txt 文件中,我们使用set命令定义源代码文件路径,然后使用add_library命令构建静态库。最后,使用target_include_directories命令包含当前目录(即src目录)的头文件。
接着,我们编写include目录下的CMakeLists.txt 文件,定义以下内容:
set(HEADERS
header1.hpp
header2.hpp
)
add_library(include INTERFACE)
target_include_directories(include INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_sources(include INTERFACE ${HEADERS})
在这个CMakeLists.txt 文件中,我们使用set命令定义头文件路径,然后使用add_library命令构建接口库,并使用target_include_directories命令包含当前目录(即include目录)的头文件和target_sources命令指定库的源代码。这样做的目的是可以将这个库中的接口提供给其它项目使用。
步骤四:构建并运行项目
完成以上步骤后,我们可以直接在项目目录下使用CMake进行构建。
beijing80s-macbook-pro:~/projects/myproject$ cmake .
-- The C compiler identification is AppleClang 11.0.0.11000033
-- The CXX compiler identification is AppleClang 11.0.0.11000033
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
...
cmake生成了Makefile,并且可以使用make命令进行构建。
beijing80s-macbook-pro:~/projects/myproject$ make
Scanning dependencies of target include
[ 16%] Building CXX object include/CMakeFiles/include.dir/header1.hpp.o
[ 33%] Building CXX object include/CMakeFiles/include.dir/header2.hpp.o
[ 50%] Linking CXX static library libinclude.a
[ 50%] Built target include
Scanning dependencies of target src
[ 66%] Building CXX object src/CMakeFiles/src.dir/source1.cpp.o
[ 83%] Building CXX object src/CMakeFiles/src.dir/source2.cpp.o
[100%] Linking CXX static library libsrc.a
[100%] Built target src
最后,我们可以编写一个名为“main.cpp”的文件进行测试:
#include "header1.hpp"
#include "header2.hpp"
int main()
{
return 0;
}
然后使用如下命令进行编译链接:
beijing80s-macbook-pro:~/projects/myproject$ g++ main.cpp -Iinclude -Lsrc -lsrc -o main
在上述命令中,“-Iinclude”参数包含了头文件路径,“-Lsrc”参数包含了库文件路径,“-lsrc”参数链接了libsrc.a静态库。最终,我们使用“-o”参数指定输出文件名为“main”,然后运行:
beijing80s-macbook-pro:~/projects/myproject$ ./main
beijing80s-macbook-pro:~/projects/myproject$
以上就是使用CMake构建多文件多目录项目的教程。构建项目的过程中,我们使用了CMake自动生成Makefile文件,并将代码按照模块进行了分离,使得项目的维护和扩展变得更加容易。
阅读全文