文章目录
- 一. 构建一个包含其他库的项目
- 二. 构建过程
- 1. 创建程序源文件
- 2. 构建项目并编译源代码
- 附件
一. 构建一个包含其他库的项目
CMake学习(一):使用CMake构建一个简单的C++项目
在这上一篇文章中,我们已经了解了如何使用CMake创建一个基本项目。在这一步中,我们将学习如何在项目中创建和使用库。我们还将了解库是如何进行导入的。
要在CMake中添加库,要使用add_library()
命令并指定应组成库的源文件。
我们可以用一个或多个子目录来组织项目,而不是将所有源文件放在一个目录中。在这种情况下,我们将专门为我们的库创建一个子目录。在这里,我们可以添加一个新的CMakeLists.txt
文件和一个或多个源文件。在顶级CMakeLists.txt
文件中,我们将使用add_subdirectory()
命令将子目录添加到构建中。一旦创建了库,就可以通过target_include_directories()
和target_link_libraries()
将库连接到我们的可执行目标。
二. 构建过程
1. 创建程序源文件
-
初级文件夹内部内容
// TutorialConfig.h.in文件内容 // the configured options and settings for Tutorial #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@ #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
// tutorial.cxx文件内容 #include <cmath> #include <iostream> #include <string> // 添加头文件 #include "TutorialConfig.h" #include "MathFunctions.h" int main(int argc, char* argv[]) { if (argc < 2) { std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "." << Tutorial_VERSION_MINOR << std::endl; std::cout << "Usage: " << argv[0] << " number" << std::endl; return 1; } // 转换输入为double const double inputValue = std::stod(argv[1]); // 通过mathfunctions调用开方函数mathfunctions::sqrt const double outputValue = mathfunctions::sqrt(inputValue); std::cout << "The square root of " << inputValue << " is " << outputValue << std::endl; return 0; }
# CMakeList.txt文件内容 cmake_minimum_required(VERSION 3.10) # 设置项目名称以及版本号 project(Tutorial VERSION 1.0) # 定义cc++版本 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) # 通过使用configure_file将TutorialConfig.h.in中的内容拷贝到TutorialConfig.h中,并将其中需要替换的部分进行替换 configure_file(TutorialConfig.h.in TutorialConfig.h) # 添加子目录 add_subdirectory(MathFunctions) # 创建一个可执行文件,名为Tutorial.exe add_executable(Tutorial tutorial.cxx) # 使用target_link_libraries链接库与可执行文件 target_link_libraries(Tutorial PUBLIC MathFunctions) # 添加库文件所在目录 target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/MathFunctions" )
-
次级文件夹内容
// mysqrt.h文件内容 #pragma once namespace mathfunctions { namespace detail { double mysqrt(double x); } }
// mysqrt.cxx文件内容 #include "mysqrt.h" #include <iostream> namespace mathfunctions { namespace detail { // a hack square root calculation using simple operations double mysqrt(double x) { if (x <= 0) { return 0; } double result = x; // do ten iterations for (int i = 0; i < 10; ++i) { if (result <= 0) { result = 0.1; } double delta = x - (result * result); result = result + 0.5 * delta / result; std::cout << "Computing sqrt of " << x << " to be " << result << std::endl; } return result; } } }
// MathFunctions.h文件内容 #pragma once namespace mathfunctions { double sqrt(double x); }
// MathFunctions.cxx文件内容 #include "MathFunctions.h" #include <cmath> // 将引入mysqrt.h的代码放入预编译代码片段中 #ifdef USE_MYMATH #include "mysqrt.h" #endif namespace mathfunctions { double sqrt(double x) { // 根据预定义的USE_MYMATH,选择是否使用detail::mysqrt函数 #ifdef USE_MYMATH return detail::mysqrt(x); #else return std::sqrt(x); #endif } }
# CMakeList.txt文件内容 # 将库文件MathFunctions添加到项目中 add_library(MathFunctions MathFunctions.cxx) # 创建一个选项,可以在构建项目时是否创建MathFunctions option(USE_MYMATH "Use tutorial provided math implementation" ON) # 根据选项进行选择是否进行内部代码 if (USE_MYMATH) #在源码中添加预编译USE_MYMATH,类似于在c++文件中的#define USE_MYMATH target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH") # 添加mysqrt.cxx add_library(SqrtLibrary STATIC mysqrt.cxx) # 链接库 target_link_libraries(MathFunctions PRIVATE SqrtLibrary) endif()
2. 构建项目并编译源代码
mkdir Step2_build
cd Step2_build
cmake ..
cmake --build .
cd Debug
Tutorial 16
附件
源代码下载