- add_library()
- add_subdirectory()
- target_include_directories()
- target_link_libraries()
- PROJECT_SOURCE_DIR
1. 创建库
要在cmake中添加库,请使用add_library()
并指定由哪些源文件组成库。
我们可以使用一个或多个子目录来组织项目,而不是将所有源文件放在一个目录中。在这种情况下,我们将专门为库创建一个子目录。
在这里,我们可以添加一个新的CMakeLists.txt
文件和一个或多个源文件。在顶级CMakeLists.txt
文件中,我们将使用add_subdirectory()
将子目录添加到构建中。
一旦创建了库,它就通过target_include_directory()
和target_link_library()
连接到我们的可执行目标。
这里,我们将向项目中添加一个库,其中包含我们自己的实现,用于计算数字的平方根。然后,可执行文件可以使用这个库,而不是编译器提供的标准平方根函数。
我们将这个库放在一个名为Mathfunction
的子目录中。这个目录以及包含一个头文件MathFunctions.h
和一个源文件mysqrt.cxx
。我们不需要修改这两个文件中的任何一个。源文件。源文件有一个名为mysqrt
的函数,它提供与编译器的sqrt
函数类似的功能。
在Help/guide/tutorial/Step2
中完成TODO 1~6;
首先是MathFunctions
子目录中的单行CMakeLists.txt
。
下来,是顶层CMakeLists.txt
。
最后,使用新创建的库。
mkdir Step2_buildcd Step2_buildcmake ../Step2cmake --build .
- TODO 1
在Mathfunction
目录中的CMakeLists.txt
文件中,我们使用add_library()
创建一个名为Mathfunction
的库目标。库的源文件作为参数传递给add_library()
:add_library(MathFunctions mysqrt.cxx)
- TODO 2
为了使用这个新库,在顶级CMakeLists.txt
中添加add_subdirectory()
调用,以便构建这个库。add_subdirectory(MathFunctions)
- TODO 3
下来,使用target_link_library()
将新的库目标链接到可执行目标。target_link_libraries(Tutorial PUBLIC MathFunctions)
- TODO 4
最后,需要指定库的头文件的位置。修改target_include_directory()
,将MathFunctions.h
子目录添加为include
目录,以便可找到MathFunctions.h
文件。target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/MathFunctions" )
- TODO 5
使用库函数#include "MathFunctions.h"const double outoutValue = mysqrt(inputValue);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QMLt3VB-1673753439626)(vx_images/334435414616010.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XheElqxX-1673753439631)(vx_images/107916137941761.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewKEBGM9-1673753439633)(vx_images/435676301890165.png)]
- 如果不在
target_include_direcotry()
中添加lib,会找不到头文件func.h
- 如果没有
add_subdirectory(lib)
,不会构建子目录,会导致找不到链接库。
2. 让库可选
cmake可以使用option()
命令,这为用户提供了一个变量,他们可以在配置cmake构建时更改该变量,此设置将存储在缓存中,因此用户无需每次在构建目录上运行cmake时都设置该值。
首先,在顶层CMakeLists.txt中用option()
创建一个变量USE_MYMATH
。在同一个文件中,使用这个选项来决定是否构建并使用MathFunctions
库。
cd ../Step2_buildcmake --build .
现在让我们更新USE_MYMATHto的值为OFF,
cmake ../Step2 -D USE_MYMATH=OFF
然后构建
cmake --build .
解决方案
第一步是向顶层CMakeLists.txt文件添加一个选项。
option(USE_MYMATH "Use tutorial provided math implementation" ON)
接下来,使构建和链接MathFunctions库成为可选的,把他们添加到列表中。
if(USE_MYMATH) add_subdirectory(MathFunctions) list(APPEND EXTRA_LIBS MathFunctions) list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")endif()
现在,有了两个列表,我嫩需要更新target_link_libraries()
和target_include_directories()
来使用它们.
对于target_link_libraries()
, 我们将写出的库名称替换为EXTRA_LIBS. 这看起来像下面这样:
target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})
target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}"${EXTRA_INCLUDES})
这是处理许多组件时的经典方法。我们将在本教程的第 3 步中介绍现代方法。
对源代码的相应更改非常简单。首先,在 中tutorial.cxx,我们包含MathFunctions.h标头if USE_MYMATH
。
tutorial.cxx
#ifdef USE_MYMATH# include "MathFunctions.h"#endif
然后,在同一个文件中,我们使用USE_MYMATH
来控制使用哪个平方根函数:
#ifdef USE_MYMATH const double outputValue = mysqrt(inputValue);#else const double outputValue = sqrt(inputValue);#endif
由于源代码现在需要USE_MYMATH我们可以将其添加到 TutorialConfig.h.in:
TutorialConfig.in:
#cmakedefine USE_MYMATH
来源地址:https://blog.csdn.net/qq_51470638/article/details/128692926