项目"/>
CMake学习(二):使用CMake构建包含其他库的C++项目
文章目录
- 一. 构建一个包含其他库的项目
- 二. 构建过程
- 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;}// 转换输入为doubleconst double inputValue = std::stod(argv[1]);// 通过mathfunctions调用开方函数mathfunctions::sqrtconst 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 oncenamespace 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 iterationsfor (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 oncenamespace mathfunctions { double sqrt(double x); }
// MathFunctions.cxx文件内容 #include "MathFunctions.h" #include <cmath>// 将引入mysqrt.h的代码放入预编译代码片段中 #ifdef USE_MYMATH#include "mysqrt.h" #endifnamespace mathfunctions { double sqrt(double x) {// 根据预定义的USE_MYMATH,选择是否使用detail::mysqrt函数 #ifdef USE_MYMATHreturn detail::mysqrt(x); #elsereturn 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_MYMATHtarget_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")# 添加mysqrt.cxxadd_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
附件
源代码下载
更多推荐
CMake学习(二):使用CMake构建包含其他库的C++项目
发布评论