- 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_build
cd Step2_build
cmake ../Step2
cmake --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"constdouble 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_build
cmake --build.
现在让我们更新USE_MYMATHto的值为OFF,
cmake ../Step2 -DUSE_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
#ifdefUSE_MYMATH#include"MathFunctions.h"#endif
然后,在同一个文件中,我们使用
USE_MYMATH
来控制使用哪个平方根函数:
#ifdefUSE_MYMATHconstdouble outputValue =mysqrt(inputValue);#elseconstdouble outputValue =sqrt(inputValue);#endif
由于源代码现在需要USE_MYMATH我们可以将其添加到 TutorialConfig.h.in:
TutorialConfig.in:
#cmakedefineUSE_MYMATH
版权归原作者 barbyQAQ 所有, 如有侵权,请联系我们删除。